pandas:根据另一列的值

时间:2015-10-22 16:16:30

标签: python pandas

我的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')

2 个答案:

答案 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循环的语法糖,如果存在矢量化解决方案,应该避免这种情况。