python pandas:根据列表

时间:2017-06-08 05:48:12

标签: python-2.7 pandas dataframe

我有一个如下数据框:

        f1              f2              class              n
0   weekly_return   0.155796               ab            weekly
1   monthly_return  0.153907               ab            monthly
2   volume_ratio    0.123844               NaN           volume
3   margin_selling_balance  0.115411       ad            margin
4   margin_debt_balance 0.107883           ae            margin
5   rv_ratio    0.077373                   NaN            rv
..................................................................

并且有一个名为lst_n的列表如下:

lst_n = ['rv', 'ag', 'rg', ...........]

如果n的值在lst_n中,我想将此数据帧的class列的值设置为'class_a'。例如第五行,n是rv,它位于n列表(lst_n)中,因此class的值设置为'class_a'。 我的代码如下,但有错误:

  lst_n = ['rv', 'ag', 'rg', ...........]
  df.loc[df.n is in lst_n, 'class'] = 'class_a'

但有错误:

df.loc[df.n is in lst_n, 'class'] = 'class_a'
                           ^
SyntaxError: invalid syntax

谢谢!

2 个答案:

答案 0 :(得分:3)

掩码需要isin

lst_n = ['rv', 'ag', 'rg']
df.loc[df['n'].isin(lst_n), 'class'] = 'class_a'
print (df)
                       f1        f2    class        n
0           weekly_return  0.155796       ab   weekly
1          monthly_return  0.153907       ab  monthly
2            volume_ratio  0.123844      NaN   volume
3  margin_selling_balance  0.115411       ad   margin
4     margin_debt_balance  0.107883       ae   margin
5                rv_ratio  0.077373  class_a       rv

Series.mask的另一个解决方案:

df['class'] = df['class'].mask(df.n.isin(lst_n), 'class_a')
print (df)
                       f1        f2    class        n
0           weekly_return  0.155796       ab   weekly
1          monthly_return  0.153907       ab  monthly
2            volume_ratio  0.123844      NaN   volume
3  margin_selling_balance  0.115411       ad   margin
4     margin_debt_balance  0.107883       ae   margin
5                rv_ratio  0.077373  class_a       rv

答案 1 :(得分:1)

如果您需要一点性能,可以使用np.where。

df['class'] = np.where(df.n.isin(lst_n), 'class_a', df['class'])

df
Out[942]: 
                       f1        f2    class        n
0           weekly_return  0.155796       ab   weekly
1          monthly_return  0.153907       ab  monthly
2            volume_ratio  0.123844      NaN   volume
3  margin_selling_balance  0.115411       ad   margin
4     margin_debt_balance  0.107883       ae   margin
5                rv_ratio  0.077373  class_a       rv