我有一个这样的数据框:
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等,但无法获得所需的结果。我原始数据集中的行数为数千,因此循环并创建单个数据集然后合并无济于事
答案 0 :(得分:0)
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
编辑:在我撰写此答案时,您已编辑了问题,现在您可能需要对其进行一些改进以使其适用于您发布的新示例输入。
答案 1 :(得分:0)
这是您的操作方式:
Z
输出为:
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()
caveat :只有在每个ID的行数不超过26的情况下,此方法才起作用。