Hal*_*Ali 7 pandas pandas-groupby
在groupby-aggregate中使用多个函数会产生一个多索引,然后我想要展平.
例:
df = pd.DataFrame(
{'A': [1,1,1,2,2,2,3,3,3],
'B': np.random.random(9),
'C': np.random.random(9)}
)
out = df.groupby('A').agg({'B': [np.mean, np.std], 'C': np.median})
# example output
B C
mean std median
A
1 0.791846 0.091657 0.394167
2 0.156290 0.202142 0.453871
3 0.482282 0.382391 0.892514
Run Code Online (Sandbox Code Playgroud)
目前,我是这样手动完成的
out.columns = ['B_mean', 'B_std', 'C_median']
Run Code Online (Sandbox Code Playgroud)
这给了我想要的结果
B_mean B_std C_median
A
1 0.791846 0.091657 0.394167
2 0.156290 0.202142 0.453871
3 0.482282 0.382391 0.892514
Run Code Online (Sandbox Code Playgroud)
但是我正在寻找一种自动化这个过程的方法,因为这是单调的,耗时的,并且允许我在重命名列时进行拼写错误.
在进行groupby-aggregate时,有没有办法返回扁平索引而不是多索引?
我需要将列展平以保存到文本文件,然后由不处理多索引列的其他程序读取该文件.
WeN*_*Ben 18
你可以map
join
用列做
out.columns = out.columns.map('_'.join)
out
Out[23]:
B_mean B_std C_median
A
1 0.204825 0.169408 0.926347
2 0.362184 0.404272 0.224119
3 0.533502 0.380614 0.218105
Run Code Online (Sandbox Code Playgroud)
出于某种原因(当列包含int时)我更喜欢这种方式
out.columns.map('{0[0]}_{0[1]}'.format)
Out[27]: Index(['B_mean', 'B_std', 'C_median'], dtype='object')
Run Code Online (Sandbox Code Playgroud)
Jul*_*lio 11
从版本 0.24.0 开始,您可以只使用to_flat_index。
out.columns = [f"{x}_{y}" for x, y in out.columns.to_flat_index()]
B_mean B_std C_median
A
1 0.779592 0.137168 0.583211
2 0.158010 0.229234 0.550383
3 0.186771 0.150575 0.313409
Run Code Online (Sandbox Code Playgroud)
您可以使用:
out.columns = list(map('_'.join, out.columns.values))
Run Code Online (Sandbox Code Playgroud)
基于其他答案:如果其中一列在第二级中未命名,则列名称后面会带有反斜杠(例如D_
)。
为了防止这种情况,请使用 lambda 函数:
out.columns = out.columns.map(lambda x: '_'.join(a for a in x if len(a)>0))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3982 次 |
最近记录: |