我的df看起来像这样:
df
dim_pptx qp_pptx diff
Absolute Radio 7.39 7.53 0.14
BBC Asian Network 0.13 0.13 0.00
BBC Radio 1 14.41 14.55 0.14
BBC Radio 1Xtra 0.57 0.58 0.01
BBC Radio 2 23.36 23.39 0.03
我想添加一个新列,其中包含基于df ['diff']
的值预期产出:
df
dim_pptx qp_pptx diff sig
Absolute Radio 7.39 7.53 0.14 **
BBC Asian Network 0.13 0.13 0.00 -
BBC Radio 1 14.41 14.55 0.14 **
BBC Radio 1Xtra 0.57 0.58 0.01 -
BBC Radio 2 23.36 23.39 0.03 *
所以条件是:
if value > 0.1:
value = '**'
elif value > 0.02:
value = '*'
else:
value = '-'
我的尝试:
comp_df['sig'] = comp_df.apply(lambda x : '*' if comp_df['diff'] > 0.01 else '', axis=0)
错误:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index dim_pptx')
答案 0 :(得分:2)
如果您使用axis=0
时使用apply
,则会通过列应用条件,要使用axis=1
遍历每一行,您需要'diff'
。
但鉴于此,您可以在comp_df['sig'] = comp_df['diff'].apply(lambda x: '**' if x > 0.1 else '*' if x > 0.02 else '-')
系列中使用DataFrame.apply
代替Series.apply
。示例 -
.visible-borders {
border: solid 1px black;
display:block;
}
.visible-borders:after {
content:"\00a0";
}
答案 1 :(得分:1)
您可以设置符合条件的所有值,而不是通过调用apply
来遍历df,因此以下内容应该可以正常工作,因为它的矢量化对于较大的数据集会更好地缩放:
df.loc[df['diff'] > 0.1,'sig'] = '**'
df.loc[(df['diff'] > 0.02) & (df['diff'] <= 0.1), 'sig'] = '*'
df.loc[df['diff'] <= 0.02, 'sig'] = '-'
这将设置符合条件的所有行,使用apply
的问题是它只是for
循环的语法糖,如果存在矢量化解决方案,应该避免这种情况。