熊猫合并同名列

时间:2021-01-23 14:30:08

标签: python 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 有很多名称相同的列,以及更多的行。因此,解决方案需要考虑到这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

Idea 通过 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

答案 1 :(得分:0)

希望能帮到你

df1=pd.concat([df.iloc[:,0],df.loc[:,df.columns.duplicates()]],axis=1)
df2=df.loc[:,~df.columns.duplicates()]
df=pd.concat([df1,df2],axis=1)