【问题标题】:Pandas data reshaping, turn multiple rows with the same index but different values into many columns based on incidencePandas 数据重塑,根据发生率将具有相同索引但不同值的多行转换为多列
【发布时间】:2018-12-12 05:58:39
【问题描述】:

我在熊猫中有下表

user_id idaggregate_info    num_events  num_lark_convo_events   num_meals_logged    num_breakfasts  num_lunches num_dinners num_snacks  total_activity  sleep_duration  num_activity_events num_weights num_notifs  idusermission   completed   mission_delta
0   0   406 94  20  7   2   2   2   1   4456    47738   72  0   18  1426    0   NaT
1   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   7 days 10:04:28
2   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   NaT
3   2   2088    356 32  15  6   6   1   2   41598   184113  314 1   21  967 1   8 days 00:03:05
4   2   2088    356 32  15  6   6   1   2   41598   184113  314 1   21  967 1   NaT

一些 user_id 有多个相同的行,除了他们不同的mission_delta 值。如何将其转换为每个 id 的一行,列名为“mission_delta_1”、“mission_delta_2”(它们的数量不同,每个 user_id 可能是 1 个,每个 user_id 可能是 5 个,因此命名必须是 iterative_ 等等,所以输出应该是:

user_id idaggregate_info    num_events  num_lark_convo_events   num_meals_logged    num_breakfasts  num_lunches num_dinners num_snacks  total_activity  sleep_duration  num_activity_events num_weights num_notifs  idusermission   completed   mission_delta_1 mission_delta_2
0   0   406 94  20  7   2   2   2   1   4456    47738   72  0   18  1426    0   NaT
1   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   7 days 10:04:28  NaT
2   2   2088    356 32  15  6   6   1   2   41598   184113  314 1   21  967 1   8 days 00:03:05     NaT

Not a duplicate 作为所有列爆炸的地址,只有一个需要取消堆叠。重复链接中提供的解决方案失败:

df.groupby(level=0).apply(lambda x: pd.Series(x.values.flatten()))

使用不同的标签生成与原始文件相同的 df

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16
    0   0   406 94  20  7   2   2   2   1   4456    47738   72  0   18  1426    0   NaT
    1   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   7 days 10:04:28
    2   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   NaT
    3   2   2088    356 32  15  6   6   1   2   41598   184113  314 1   21  967 1   8 days 00:03:05

下一个选项:

result2.groupby(level=0).apply(lambda x: pd.Series(x.stack().values))

产生:

0     0         0
  1       406
  2        94
  3        20
  4         7

df.groupby(level=0).apply(lambda x: x.values.ravel()).apply(pd.Series)

产生原始数据框:

    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16
    0   0   406 94  20  7   2   2   2   1   4456    47738   72  0   18  1426    0   NaT
    1   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   7 days 10:04:28
    2   1   1247    121 48  26  8   7   2   9   48695   37560   53  14  48  1379    1   NaT
    3   2   2088    356 32  15  6   6   1   2   41598   184113  314 1   21  967 1   8 days 00:03:05

本质上,我想转一个df:

id    mission_delta
0     NaT
1     1 day
1     2 days
1     1 day
2     5 days
2      NaT

进入

id    mission_delta1  mission_delta_2 mission_delta_3
0     NaT     NaT        NaT
1     1 day   2 days    1 day
2     5 days   NaT      NaT

【问题讨论】:

  • 已编辑以更新链接答案未完全解决我的问题。
  • 嗨,Heather,如果答案有帮助,也请点赞

标签: python pandas pivot-table reshape


【解决方案1】:

你可以试试这个;

grp = df.groupby('id')
df_res = grp['mission_delta'].apply(lambda x: pd.Series(x.values)).unstack().fillna('NaT')
df_res = df_res.rename(columns={i: 'mission_delta_{}'.format(i + 1) for i in range(len(df_res))})

print(df_res)

   mission_delta_1 mission_delta_2 mission_delta_3
id                                                
0              NaT             NaT             NaT
1            1 day          2 days           1 day
2           5 days             NaT             NaT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2014-01-10
    • 1970-01-01
    • 2018-05-27
    • 2020-05-19
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多