我有一个关于在Python中过滤pandas的新问题。
我的原始数据框DF看起来像这样
date currency 1Y 1Y1M 1Y2M 1Y3M 1Y4M
2013-09-25 EUR 0 0 0 0 0
2013-09-26 EUR 0 0 0 0 0
2013-09-27 EUR 0 0 0 0 0
2013-09-28 EUR 0 0 0 0 0
2013-09-29 EUR 0 0 0 0 0
2013-09-25 USD 0 0 0 0 0
2013-09-26 USD 0 -2 -4 -8 -10
2013-09-27 USD 0 -1 -1 -6 -1
2013-09-28 USD 0 -3 -6 -2 -6
2013-09-29 USD 0 -5 -1 -6 -7
我想做的是以某种方式过滤“USD”上的这些数据,并将符号更改为符合条件的所有可用数据。我想要更改原始数据(所以不是副本),即结果数据帧(即DF)将是,
date currency 1Y 1Y1M 1Y2M 1Y3M 1Y4M
2013-09-25 EUR 0 0 0 0 0
2013-09-26 EUR 0 0 0 0 0
2013-09-27 EUR 0 0 0 0 0
2013-09-28 EUR 0 0 0 0 0
2013-09-29 EUR 0 0 0 0 0
2013-09-25 USD 0 0 0 0 0
2013-09-26 USD 0 2 4 8 10
2013-09-27 USD 0 1 1 6 1
2013-09-28 USD 0 3 6 2 6
2013-09-29 USD 0 5 1 6 7
我尝试过使用'where'功能(打印看效果)
mask = DF['currency'].str.contains('USD')
print DF.ix[mask,'1Y1M']
DF.where(DF[~mask], -1 * DF,inplace=True)
print data_BBG.ix[mask,'1Y1M']
但是打印结果显示没有效果。
任何见解都会很棒!
答案 0 :(得分:3)
df.loc[df['currency']=='USD', '1Y':'1Y4M'] *= -1
产量
date currency 1Y 1Y1M 1Y2M 1Y3M 1Y4M
0 2013-09-25 EUR 0 0 0 0 0
1 2013-09-26 EUR 0 0 0 0 0
2 2013-09-27 EUR 0 0 0 0 0
3 2013-09-28 EUR 0 0 0 0 0
4 2013-09-29 EUR 0 0 0 0 0
5 2013-09-25 USD 0 0 0 0 0
6 2013-09-26 USD 0 2 4 8 10
7 2013-09-27 USD 0 1 1 6 1
8 2013-09-28 USD 0 3 6 2 6
9 2013-09-29 USD 0 5 1 6 7
虽然DF['currency'].str.contains('USD')
可能比df['currency']=='USD'
更快,但我建议使用后者来保证您只选择货币与美元完全相等的行。前者可能包括其货币恰好包含字母USD
的行。我不确定这是否可能,但为什么要冒风险呢。