繁体   English   中英

在单个 pandas dataframe 中连接具有相同列值的行

[英]Concatenate rows with same column value in a single pandas dataframe

我有一个 pandas dataframe 像这样:

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

最终的 dataframe 将如下所示:

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

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

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

使用GroupBy.cumcount作为计数器,然后通过DataFrame.set_indexDataFrame.unstack进行整形,通过DataFrame.sort_index对第二级MultiIndex进行排序,然后通过join :tensort_index 对第二级 MultiIndex 进行排序

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()

我认为这对你有用。 如果要为后缀添加数字,只需添加一个计数器。

final=pd.DataFrame()
for i in df['code'].unique():
    final=pd.concat([final,df.query(f'code=="{i}"').set_index('id').add_suffix(f"_{i}")],axis=1).fillna(-1)


   code_A  mean_A  count_A code_B  mean_B  count_B code_C  mean_C  count_C
id                                                                        
1       A      32       22      B       9       56      C    25.0     78.0
2       A      33       35      B      11       66     -1    -1.0     -1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM