我有一个包含许多描述性列和几个值列的DataFrame,例如以下val1
和val2
是值,其他所有内容都描述了这些值:
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。
答案 0 :(得分: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'
替换为您不感兴趣的任何其他列或列子集,这样您只需要执行一次。