大熊猫中的列以其他列

时间:2016-12-09 20:37:43

标签: python pandas

我正在尝试制作一组​​合成数据。我使用的是Python 3.5.2。我首先将其定义为:

#Make Synthetic data (great again?)
#synth X
data=pd.DataFrame(np.random.randn(100,5), columns= 'x1','x2','x3','x4','x5']) 
def div10(x):
    if x<0:
        return -x/5
    else:
        return x/10
data=data.applymap(div10)

从这里我想定义一个新的列,如果行中X的平均值的双曲正切值大于.15,则为“死”字符串,否则为“活着”

data['Y']=data.apply( lambda x:'dead' if np.tanh(data.mean(axis=1))>.15 else     'alive',axis=1)

我被告知ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')当我检查np.tanh(data.mean(axis=1))>.15时,我会得到一份布尔列表。

我也试过了地图,但AttributeError: 'DataFrame' object has no attribute 'map'

2 个答案:

答案 0 :(得分:0)

您需要确保使用lambda函数中指定的'x'。此外,由于x是一个系列(数据框中的行),轴= 1将不起作用。 data['Y']=data.apply(lambda x:'dead' if np.tanh(x.mean())>.15 else 'alive',axis=1)

答案 1 :(得分:0)

学会使用where语句来获得更好更快的代码。

np.where(np.tanh(np.mean(np.where(data<0, -data / 5, data / 10), axis=1)) > .15, 'dead', 'alive')

让我们分成几块。 where语句可以对多维数据(例如您拥有的数据帧)进行操作。它们采用条件并在逗号后返回第一个参数为true,第二个参数返回false

step1 = np.where(data<0, -data / 5, data / 10)

没有必要使用apply,因为numpy有一个矢量化的平均函数,你可以按行应用(axis = 1)

step2 = np.mean(step1, axis=1)

现在你有了一维数据。采取双曲正切

step3 = np.tanh(step2)

最后使用另一个where语句来获得死亡或活着状态

np.where(step3 > .15, 'dead', 'alive')