2013-06-23 9 views
11

を合計:Pythonのパンダの条件は、サンプルデータを使用して

df = pd.DataFrame({'key1' : ['a','a','b','b','a'], 
       'key2' : ['one', 'two', 'one', 'two', 'one'], 
       'data1' : np.random.randn(5), 
       'data2' : np. random.randn(5)}) 

DF

data1  data2  key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
2 1.468194 0.272929 b one 
3 -1.138458 0.865060 b two 
4 -0.268210 1.250340 a one 

私は「KEY1と和によってどのグループにKEY2に等しいだけDATA1値をデータを把握しようとしています1'。ここで

は私が

def f(d,a,b): 
    d.ix[d[a] == b, 'data1'].sum() 

df.groupby(['key1']).apply(f, a = 'key2', b = 'one').reset_index() 

しようとしたものだ。しかし、これは私に 'なし' はここ

index key1 0 
0  a  None 
1  b  None 

任意のアイデア値はありませんとのデータフレームを与えますか?私は、次のSQLのパンダと同等を探しています:

SELECT Key1, SUM(CASE WHEN Key2 = 'one' then data1 else 0 end) 
FROM df 
GROUP BY key1 

をFYI - 私はconditional sums for pandas aggregateを見てきましたが、合計ではなく、数で動作するように設け答えを変換することができませんでした。事前に

おかげ

答えて

20

まずGROUPBYキー1列:

In [11]: g = df.groupby('key1') 

、その後、グループごとにキー2が '1' を等しいsubDataFrameを取り、DATA1列を合計:

In [12]: g.apply(lambda x: x[x['key2'] == 'one']['data1'].sum()) 
Out[12]: 
key1 
a  0.093391 
b  1.468194 
dtype: float64 

何が起きているのかを説明するために、 'a'グループを見てみましょう。

In [21]: a = g.get_group('a') 

In [22]: a 
Out[22]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
1 0.069889 0.809772 a two 
4 -0.268210 1.250340 a one 

In [23]: a[a['key2'] == 'one'] 
Out[23]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
4 -0.268210 1.250340 a one 

In [24]: a[a['key2'] == 'one']['data1'] 
Out[24]: 
0 0.361601 
4 -0.268210 
Name: data1, dtype: float64 

In [25]: a[a['key2'] == 'one']['data1'].sum() 
Out[25]: 0.093391000000000002 

KEY2とするだけで、それらのデータフレームを制限することによって、これを行うために明確に/やや容易であろうが最初の1に等しい:

In [31]: df1 = df[df['key2'] == 'one'] 

In [32]: df1 
Out[32]: 
     data1  data2 key1 key2 
0 0.361601 0.375297 a one 
2 1.468194 0.272929 b one 
4 -0.268210 1.250340 a one 

In [33]: df1.groupby('key1')['data1'].sum() 
Out[33]: 
key1 
a  0.093391 
b  1.468194 
Name: data1, dtype: float64 
+0

すごいです!私は実際のデータにこれを試しています(しばらく時間がかかるかもしれません)が、これは私が探していたものだと思います。ありがとうございました – AllenQ

+0

私はここで新しいgroupbyフィルターを使うことができると思います... – Jeff

+0

ドキュメントとすばやいグーグル検索を検索しました...あなたがgroupbyフィルターによって参照しているものを正確に見つけることができませんでした。あなたは正しい方向に私を向ける? – AllenQ

関連する問題