我正在尝试制作一组合成数据。我使用的是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'
答案 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')