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

时间:2019-01-06 12:57:22

标签: python pandas dataframe merge pandas-groupby

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

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

我想将其他行合并到当前行,如下所示。例如:对于第一行,前四列保持不变,但列B1至B4是从A1至A4的第二行的副本,而C1至C2是从A1至A4的第三行的副本。第二行和第三行的合并类似。

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,循环等,但无法获得所需的结果。

3 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

如果已经创建了其他两个数据框,则只需遵循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

注意:此过程是针对排列的,因此您可以期望有相同数量的组合,每次运行代码时都不会相同。

答案 2 :(得分:0)

这是我的通用循环方法,至少可以创建多达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熊猫不包含的内容: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