使用Python / Pandas将两行数据合并为一行

时间:2019-10-06 06:06:36

标签: python pandas dataframe

我有一个这样的数据框:

   ID   A1    A2    A3    A4                                      
0  01  100   101   103   104
1  01  501   502   503   504
2  01  701   702   703   704
3  02  1001  1002  1003  1004
4  03  2001  2002  2003  2004
5  03  5001  5002  5003  5004

我需要将属于同一ID的行合并为一行,合并后的数据帧将像这样

   ID   A1    A2    A3    A4    B1    B2    B3     B4     C1   C2    C3    C4                                                   
0  01  101   102   103   104   501   502    503    504    701  702   703   704 
1  02  1001  2001  1003  1004  
2  03  2001  2002  2003  2004  5001  5002   5003   5004

我尝试使用np.random.permutation,np.roll等,但无法获得所需的结果。我原始数据集中的行数为数千,因此循环并创建单个数据集然后合并无济于事

2 个答案:

答案 0 :(得分:0)

unstacked = df.unstack()为您提供了第一步:

A1  0    1001
    1    5001
    2    7001
A2  0    1002
    1    5002
    2    7002
A3  0    1003
    1    5003
    2    7003
A4  0    1004
    1    5004
    2    7004

然后,您可以提取索引的两个“级别”:

colname = unstacked.index.get_level_values(0) # A1,A1,A1,A2,...
rownum = unstacked.index.get_level_values(1) # 0,1,2,0,...

然后将它们转换为所需的格式:

idxchr = (rownum + ord('A')).map(chr) # A,B,C,A,...
idxnum = colname.str[1] # 1,1,1,2,...

最后,覆盖未堆积的索引:

unstacked.index = idxchr + idxnum

结果:

A1    1001
B1    5001
C1    7001
A2    1002
B2    5002
C2    7002
A3    1003
B3    5003
C3    7003
A4    1004
B4    5004
C4    7004

编辑:在我撰写此答案时,您已编辑了问题,现在您可能需要对其进行一些改进以使其适用于您发布的新示例输入。

答案 1 :(得分:0)

这是您的操作方式:

Z

输出为:

import pandas as pd


def widen(x):
    num_rows = len(x)
    num_cols = len(x.columns)

    new_index = [
        chr(ord('A') + row_number) + str(col_number + 1)
        for row_number in range(num_rows)
        for col_number in range(num_cols)
    ]

    return pd.Series(x.loc[:, 'A1':].unstack().values, index=new_index)

res = df.groupby('ID').apply(widen).unstack()

caveat :只有在每个ID的行数不超过26的情况下,此方法才起作用。