2015-07-28 28 views
0

我有許多描述列的數據幀和一對夫婦值列,例如下面的其中val1val2是值和其他一切描述的那些值:骨料(總和)數據幀在單個列或多指標水平

In [58]: countries = ['X', 'Y', 'Z']; sectors = ['A', 'B', 'C'] 
In [59]: ch = np.random.choice 
In [61]: df = pd.DataFrame(dict(c=ch(countries, 100), s1=ch(sectors, 100), s2=ch(sectors, 100), is_good=ch([True, False], 100), val1=np.random.random(100), val2=np.random.random(100))) 
In [62]: df.head() 
Out[62]: 
    c is_good s1 s2  val1  val2 
0 Z True B B 0.694949 0.145197 
1 X True A A 0.319551 0.548003 
2 X False A C 0.946967 0.220035 
3 X False B A 0.998087 0.902530 
4 Y False B C 0.303517 0.660556 

說我對一個值是否「好」不感興趣,所以我想總結is_good上的值列。

一般情況下我會怎麼做:

In [63]: df.set_index(['c', 's1', 's2', 'is_good']).sum(level=['c', 's1', 's2']) 
Out[63]: 
      val1  val2 
c s1 s2      
X A A 2.170132 1.999072 
    B 2.038995 3.528096 
    C 4.041300 3.150400 
    B A 2.418448 2.011886 
    B 1.212810 1.489008 
    C 0.284823 0.961956 

,但是當有大量的描述性的列這變得有點笨拙,而且容易出錯。 (這裏的情況很好,但是如果還有其他情況的話,這可能會很艱難。)

我真的很想找一個指定is_good列的操作,而不是specifying everything but that column

回答

1

你可以設置它是這樣的:

val_cols = ['val1', 'val2'] 
descriptive_cols = df.columns.difference(val_cols) 
group_cols = descriptive_cols.difference(['is_good']) 
df.groupby(group_cols)[val_cols].sum() 

一旦你做出初步的定義,那麼你可以用你不感興趣的列的任何其他列或子取代'is_good'所以你只需要做一次。

+0

+1使用'df.columns.difference'。以前從未見過!如果c不在(some_list)中,我總是這樣做'[c for df.columns]''但是這樣很光滑!你甚至不需要'set()'位。 – LondonRob

+0

是的,你也可以在'&, - ,|,^'這樣的索引上使用set操作,但是存在棄用警告。它建議使用命名方法,例如'.intersection,.diff,.union,.sym_diff'等。我編輯了答案以刪除不必要的'set'調用 – JoeCondron

+0

爲了澄清,所有這些操作都可以在行和列索引上完成 – JoeCondron