首页 > 解决方案 > Pandas:基于标题子字符串的部分枢轴

问题描述

我熟悉标准的 Pandas 枢轴功能,但我想做的有点不同——而且我不习惯使用pivot.

设置代码:

import pandas as pd
import io

csvA = io.StringIO(u'''
month   chicken_a   chicken_b   chicken_c   turkey_a    turkey_b    turkey_c
1   10  20  30  1   2   3
2   11  22  33  101 202 303
''')

dfA = pd.read_csv(csvA, sep = '\t')

产生:

   month  chicken_a  chicken_b  chicken_c  turkey_a  turkey_b  turkey_c
0      1         10         20         30         1         2         3
1      2         11         22         33       101       202       303

我想将部分'_a', '_b', and '_c'转向月份,但保留“鸡”和“火鸡”标题。最终结果将如下所示:

  month  chicken  turkey
0    1a       10       1
1    1b       20       2
2    1c       30       3
3    2a       11     101
4    2b       22     202
5    2c       33     303

'_a', '_b', '_c'部分将永远是那样,并且会提前知道。

我可以通过循环破解这个for,但我想知道是否有更熊猫的方式。

标签: pythonpandaspivot

解决方案


我找到了一个我不喜欢的解决方案,但仍然觉得有点 hacky,但是没有循环,它完成了工作。我绝对愿意接受更好的解决方案:

df  = dfA.set_index('month').stack().reset_index()

df['month_type']    = df['month'].astype(str) + df['level_1'].str[-1:]
df['level_1']       = df['level_1'].str[:-2]

df  = df.drop(['month'], axis = 1)
df  = df.pivot(index = 'month_type', columns = 'level_1', values = 0)
df  = pd.DataFrame(df.to_records())

推荐阅读