如何使用 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:如何在不编写辅助函数的情况下使用 apply 广播操作