我有一个像这样的熊猫数据框:
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,有些可能是 2,有些可能是 3 或更多。我想连接所有具有相同 ID 的行。我知道某些 ID 的某些列最终会为空,因为它们的“N”与其他 ID 的 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
请询问可能需要的任何其他信息。
编辑 请注意,您使用的是 vanilla pandas,而不是 modin.pandas 或任何其他版本的 pandas。我在尝试使用 modin.pandas 执行问题时遇到了问题,但 vanilla pandas 工作正常。
使用GroupBy.cumcount作为计数器,然后按DataFrame.set_index和重塑,按DataFrame.unstack第二级排序,最后按展平 MultiIndex :MultiIndexDataFrame.sort_indexjoin
GroupBy.cumcount
DataFrame.set_index
DataFrame.unstack
MultiIndex
DataFrame.sort_index
join
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:
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()