2013-05-22 68 views
3

我有一個熊貓數據框,我想要創建一個新的列,對於不同的行組進行不同的計算。下面是一個簡單的例子:分配到熊貓中的選擇

import pandas as pd 

data = {'foo': list('aaade'), 'bar': range(5)} 
df = pd.DataFrame(data) 

數據框看起來是這樣的:

 bar foo 
0 0 a 
1 1 a 
2 2 a 
3 3 d 
4 4 e 

現在我加入了一個新的列,並嘗試一些值分配給選定的行:

df['xyz'] = 0 
df.loc[(df['foo'] == 'a'), 'xyz'] = df.loc[(df['foo'] == 'a')].apply(lambda x: x['bar'] * 2, axis=1) 

數據幀沒有改變。什麼我希望是這個樣子的數據框:

 bar foo xyz 
0 0 a 0 
1 1 a 2 
2 2 a 4 
3 3 d 0 
4 4 e 0 

在我的現實世界的問題,「XYZ」列也computated對於其他行,但使用不同的功能。實際上,我也在使用不同的列進行計算。所以我的問題:

  1. 爲什麼上述例子中的賦值不起作用?
  2. 是否需要兩次做df.loc[(df['foo'] == 'a')(正如我現在這樣做)?

回答

3

您正在更改df的副本(DataFrame的布爾值掩碼是副本,請參閱docs)。
另一種方式,以達到預期的結果如下:

In [11]: df.apply(lambda row: (row['bar']*2 if row['foo'] == 'a' else row['xyz']), axis=1) 
Out[11]: 
0 0 
1 2 
2 4 
3 0 
4 0 
dtype: int64 

In [12]: df['xyz'] = df.apply(lambda row: (row['bar']*2 if row['foo'] == 'a' else row['xyz']), axis=1) 

In [13]: df 
Out[13]: 
    bar foo xyz 
0 0 a 0 
1 1 a 2 
2 2 a 4 
3 3 d 0 
4 4 e 0 

也許一個更簡潔的方式就是:

In [21]: 2 * (df1.bar) * (df1.foo == 'a') 
Out[21]: 
0 0 
1 2 
2 4 
3 0 
4 0 
dtype: int64 
+0

是,傑夫,寫更多的東西來的文檔是我的待辦事項列表。 :) –

+0

,我甚至沒有評論:) – Jeff

+0

感謝您的快速回答。這正是我想要的。如果有其他呼叫,可以將這些鏈接起來嗎? – uuazed