使用Python / Pandas将两行数据合并为一行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python / Pandas将两行数据合并为一行相关的知识,希望对你有一定的参考价值。
我有一个像这样的数据框:
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等,但无法获得所需的结果。我的原始数据集中的行数为数千,因此循环并创建单个数据集然后合并无济于事
答案
这是您的操作方式:
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()
输出为:
A1 A2 A3 A4 B1 ... B4 C1 C2 C3 C4
ID ...
1 100.0 501.0 701.0 101.0 502.0 ... 503.0 703.0 104.0 504.0 704.0
2 1001.0 1002.0 1003.0 1004.0 NaN ... NaN NaN NaN NaN NaN
3 2001.0 5001.0 2002.0 5002.0 2003.0 ... 5004.0 NaN NaN NaN NaN
caveat:这仅在假设每个ID的行数不超过26的情况下有效。
另一答案
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
编辑:您在我撰写此答案时编辑了您的问题,现在您可能需要对其进行一些增强以使其适用于您发布的新示例输入。
以上是关于使用Python / Pandas将两行数据合并为一行的主要内容,如果未能解决你的问题,请参考以下文章