我有一个看起来像这样的数据框:
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,循环等,但无法获得所需的结果。
答案 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