首页 > 解决方案 > 在单个熊猫数据框中连接具有相同列值的行

问题描述

我有一个像这样的熊猫数据框:

id code mean count  

1   A    32    22  
1   B    9     56
1   C    25    78
2   A    33    35
2   B    11    66

基本上,对于每个 ID,可能有 N 个条目,并且每个 ID 的 N 不同,对于某些可能是 1,对于某些可能是 3 或更多。我想连接所有具有相同 ID 的行。我知道某些 ID 的某些列最终会为空,因为与其他 ID 的 N 相比,它们的“N”会更低,所以我想为这些空列填写 -1

最终数据框将如下所示:

id code1 mean1 count1 code2 mean2 count2 code3 mean3 count3

1   A    32      22    B     9     56     C     25    78
2   A    33      35    B     11    66     -1    -1    -1

请询问可能需要的任何其他信息。

编辑
请注意您使用的是香草熊猫而不是 modin.pandas 或任何其他版本的熊猫。我在使用 modin.pandas 时尝试执行问题时遇到了问题,但 vanilla pandas 工作得很好。

标签: pythonpandas

解决方案


用于GroupBy.cumcount计数器,然后通过DataFrame.set_indexand重塑形状,对by 的DataFrame.unstack第二级进行排序,最后将 MultiIndex 展平为:MultiIndexDataFrame.sort_indexjoin

df = pd.DataFrame({'id': [1, 1, 1, 2, 2], 
                   'code': ['A', 'B', 'C', 'A', 'B'],
                   'mean': [32, 9, 25, 33, 11], 
                   'count': [22, 56, 78, 35, 66]})

print (df)
   id code  mean  count
0   1    A    32     22
1   1    B     9     56
2   1    C    25     78
3   2    A    33     35
4   2    B    11     66

print (df.columns)
Index(['id', 'code', 'mean', 'count'], dtype='object')


print (df.columns.tolist())
['id', 'code', 'mean', 'count']

df['g'] = df.groupby('id').cumcount().add(1)
df = (df.set_index(['id','g'])
        .unstack(fill_value=-1)
        .sort_index(level=1, axis=1))

df.columns = df.columns.map(lambda x: f'{x[0]}{x[1]}')

对于转换id为列使用reset_index

df = df.reset_index()
print (df)
   id code1  count1  mean1 code2  count2  mean2 code3  count3  mean3
0   1     A      22     32     B      56      9     C      78     25
1   2     A      35     33     B      66     11    -1      -1     -1
df = df.reset_index()

推荐阅读