使用'where'过滤Python中的pandas

时间:2014-02-17 09:52:31

标签: python pandas

我有一个关于在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']

但是打印结果显示没有效果。

任何见解都会很棒!

1 个答案:

答案 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的行。我不确定这是否可能,但为什么要冒风险呢。