透视 Dataframe ,不丢失重复值

3wabscal  于 2022-10-23  发布在  其他
关注(0)|答案(2)|浏览(173)

我有这个条目

id   value  reps
1    333    1
1    332    4
1    335    1   
4    555    3
4    225    1
444  2      5

我希望这样,按列代表从少到多组织值

id   col1 col2 col3 col4 
1    333  335  332  nan 
4    225  555  nan  nan 
444  2    nan  nan  nan

我试过使用数据透视表,得到了这个

dataframe = dataframe.pivot_table(index='id', columns='reps', values='value')
dataframe = dataframe.rename_axis(columns=None).reset_index()

id   1      3      4    5
1    334    nan    332  nan
4    225.5  555.5  nan  nan
444  nan    nan    nan  2
j8ag8udp

j8ag8udp1#

您可以先按reps(如果是这样,也可以按m1n 1o1p)对 Dataframe 进行排序,然后按每个id的累积计数更改reps
然后,您可以按照建议执行透视表。

df \
  .sort_values(['id','reps']) \
  .pipe(lambda df_: df_.assign(reps=df_.groupby(['id']).cumcount()+1)) \
  .pivot_table(index='id', columns='reps', values='value') \
  .add_prefix('col')

它不会在预期输出中返回带有NaN的col4,但您可以稍后添加它。

s71maibg

s71maibg2#

按“id”分组并创建(“value”,“reps”)元组,并按“reps“排序:

df_grouped = df.groupby("id")[["value", "reps"]].apply(lambda x: sorted(list(zip(x.value, x.reps)), key=lambda x: x[1]))

[Out]:
id
1      [(333, 1), (335, 1), (332, 4)]
4                [(225, 1), (555, 3)]
444                          [(2, 5)]

使用“value”作为数据(位于索引0),从上面排序的元组创建结果 Dataframe 。

df_result = pd.DataFrame(data=[[y[0] for y in x] for x in df_grouped], index=df_grouped.index)

[Out]:
       0      1      2
id                    
1    333    335    332
4    225    555    NaN
444    2    NaN    NaN

pandas填充以0开头的默认列名。如果需要,可以更改它:

df_result.columns = list(range(1, len(df_result.columns) + 1))

相关问题