![](/img/trans.png)
[英]Pandas - Concatenate values of lists into a single column in 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_index
和DataFrame.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.