首页 > 解决方案 > Pandas 合并同名列

问题描述

我有以下数据框:

时间戳 参与者 等级 金子 参与者 等级 金子
1 1 100 6000 2 76 4200
2 1 150 5000 2 120 3700

我正在尝试更改数据框,以便命名相同的列中的所有行都移动到彼此下方,同时保持名为时间戳的列:

时间戳 参与者 等级 金子
1 1 100 6000
2 1 150 5000
1 2 76 4200
2 2 120 3700

需要明确的是,上面的例子是一个小样本,实际的 Dataframe 有很多列名称相同,还有更多的行。因此,解决方案需要考虑到这一点。

谢谢!

标签: pythonpandas

解决方案


想法是通过 for counter 对重复的列名称进行重复删除GroupBy.cumcount,然后通过以下方式重塑DataFrame.stack

df = df.set_index('Timestamp')
s = df.columns.to_series()

df.columns = [df.columns, s.groupby(s).cumcount()]

df = df.stack().reset_index(level=1, drop=True).reset_index()

如果列名不重复并添加.数字:

print (df)
   Timestamp  participant  level  gold  participant.1  level.1  gold.1
0          1            1    100  6000              2       76    4200
1          2            1    150  5000              2      120    3700

df = df.set_index('Timestamp')

df.columns = pd.MultiIndex.from_frame(df.columns.str.split('.', expand=True)
                                        .to_frame().fillna('0'))

df = df.stack().reset_index(level=1, drop=True).reset_index()
print (df)
0  Timestamp  gold  level  participant
0          1  6000    100            1
1          1  4200     76            2
2          2  5000    150            1
3          2  3700    120            2

推荐阅读