如何使用 Python/Pandas 将数据框的其他行合并到当前行

Posted

技术标签:

【中文标题】如何使用 Python/Pandas 将数据框的其他行合并到当前行【英文标题】:How to merge other rows of data frame to the current row with Python/Pandas 【发布时间】:2019-06-01 08:52:04 【问题描述】:

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

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

我想将其他行合并到当前行,看起来像这样。例如:对于第一行,前四列保持不变,但列 B1 到 B4 是从 A1 到 A4 的第二行的副本,C1 到 C2 是从 A1 到 A4 的第三行的副本。第 2 行和第 3 行的类似合并。

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

我尝试了多种方法,例如 groupby、索引、icol、循环等,但无法获得所需的结果。

【问题讨论】:

【参考方案1】:

您可以使用np.roll 对 df 的行执行循环移位:

df2 = df.reindex(index=np.roll(df.index, -1)).reset_index(drop=True)
df2.columns = ['B'.format(i) for i in range(1, len(df.columns) + 1)]

df3 = df.reindex(index=np.roll(df.index, -2)).reset_index(drop=True)
df3.columns = ['C'.format(i) for i in range(1, len(df.columns) + 1)]

result = pd.concat([df, df2, df3], axis=1)

print(result)

输出

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

【讨论】:

谢谢。它有帮助,在原始数据框中我有更多的行和列,我可以循环使用你的代码来获得输出:)【参考方案2】:

如果您已经创建了其他两个数据框,则可以按照 concat 代码进行操作。否则,您可以基于np.random.permutation 创建相同数据帧的示例,如下所示:

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

df2 = df1.iloc[np.random.permutation(len(df1))]
df2.columns=['B'.format(i) for i in range(1, len(df1.columns) + 1)]
>>df2
    B1      B2      B3      B4
1   5001    5002    5003    5004
0   1001    1002    1003    1004
2   7001    7002    7003    7004

df3 = df2.iloc[np.random.permutation(len(df2))]
df3.columns=['C'.format(i) for i in range(1, len(df1.columns) + 1)]
>>df3
    C1      C2      C3      C4
2   7001    7002    7003    7004
0   1001    1002    1003    1004
1   5001    5002    5003    5004

准备好数据帧后,您可以在axis=1 上连接它们,例如:

pd.concat([df1,df2,df3],axis=1)

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

注意此过程基于排列,因此您可以预期相同数量的组合,每次运行代码时都不会相同。

【讨论】:

谢谢,没有相同的组合仍然可以解决我的问题 :) @anky_91 - OP 不能投票,因为至少需要 15 分 :) @jezrael 没注意到。对不起:)【参考方案3】:

这将是我的一般循环方法,它至少会创建多达 25 个合理的进一步列名...:

n = 2   # number of rolled blocks to be concatenated
df2 = df
for i in range(n):
    df_roll = pd.DataFrame(np.roll(df, -(i+1), 0), columns=df.columns.str.replace('A', chr(66+i)))
    df2 = pd.concat([df2, df_roll], 1)

再次感谢@DanielMesejo 提供的提示,让我们在 numpy 中获取 pandas 中未包含的内容:roll

n=2 的结果:

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

【讨论】:

以上是关于如何使用 Python/Pandas 将数据框的其他行合并到当前行的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas:如何在数据框的列中拆分已排序的字典

Python Pandas:将数据框的列与列名合并为一列

Python Pandas:如何在不编写辅助函数的情况下使用 apply 广播操作

Python pandas 数据框的str列内置的方法详解

保存和导出 python pandas 数据框的 dtypes 信息

Python Pandas - 查找两个数据帧之间的差异