我有一个如下数据框:
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
谢谢!
答案 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