熊猫重塑重复行

时间:2017-04-24 18:16:45

标签: python pandas

我想重塑一个重复行的数据帧。数据来自csv文件,其中重复数据块。

举个例子:

    Name      1st    2nd
0 Value1      a1     b1 
1 Value2      a2     b2 
2 Value3      a3     b3
3 Value1      a4     b4
4 Value2      a5     b5
5 Value3      a6     b6

应该重塑为:

Name     1st 2nd 3rd 4th
Value1   a1  b1  a4  b4
Value2   a2  b2  a5  b5
Value3   a3  b3  a6  b6

您对此有何建议? 我已经看过这个thread,但是我看不出如何将这种方法转换为我的问题,其中groupby的列有多个列右侧。

2 个答案:

答案 0 :(得分:3)

您可以使用set_indexstack将两列合并为一列,cumcount以获取新列标签,并pivot进行重新整理:

# Stack the 1st and 2nd columns, and use cumcount to get the new column labels.
df = df.set_index('Name').stack().reset_index(level=1, drop=True).to_frame()
df['new_col'] = df.groupby(level='Name').cumcount()

# Perform a pivot to get the desired shape.
df = df.pivot(columns='new_col', values=0)

# Formatting.
df = df.reset_index().rename_axis(None, 1)

结果输出:

     Name   0   1   2   3
0  Value1  a1  b1  a4  b4
1  Value2  a2  b2  a5  b5
2  Value3  a3  b3  a6  b6

答案 1 :(得分:1)

在按名称分组后,使用df的重复值创建一个数据框,并将该df与原始值合并。

df1 = df.groupby('Name')['1st', '2nd'].apply(lambda x: x.iloc[1]).reset_index()
df1.columns = ['Name', '3rd', '4th']
df = df.drop_duplicates(subset=['Name']).merge(df1, on = 'Name')

你得到了

    Name    1st 2nd 3rd 4th
0   Value1  a1  b1  a4  b4
1   Value2  a2  b2  a5  b5
2   Value3  a3  b3  a6  b6