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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python / Pandas将两行数据合并为一行相关的知识,希望对你有一定的参考价值。

我有一个像这样的数据框:

   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等,但无法获得所需的结果。我的原始数据集中的行数为数千,因此循环并创建单个数据集然后合并无济于事

答案

这是您的操作方式:

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()

输出为:

        A1      A2      A3      A4      B1  ...      B4     C1     C2     C3     C4
ID                                          ...                                    
1    100.0   501.0   701.0   101.0   502.0  ...   503.0  703.0  104.0  504.0  704.0
2   1001.0  1002.0  1003.0  1004.0     NaN  ...     NaN    NaN    NaN    NaN    NaN
3   2001.0  5001.0  2002.0  5002.0  2003.0  ...  5004.0    NaN    NaN    NaN    NaN

caveat:这仅在假设每个ID的行数不超过26的情况下有效。

另一答案

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

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

以上是关于使用Python / Pandas将两行数据合并为一行的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ C# 将两行合并为基于列的单行

如何将两行的值合并为同一个id的单行?

SQL 将两行合二为一

sqlserver怎么将两行数据合并成一行

使用pandas将两表进行关联查询merge()-横向合并

Ms Access 像这样将两行合二为一