python - Pandas 数据 reshape ,根据关联将具有相同索引但不同值的多行转换为多列

标签 python pandas pivot-table reshape

我在 pandas 中有下表

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 个,因此命名必须是迭代的_等,因此输出将是:

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

最佳答案

你可以尝试这个;

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

关于python - Pandas 数据 reshape ,根据关联将具有相同索引但不同值的多行转换为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736898/

相关文章:

python - Pandas 时间序列重采样

python - 在数据透视表 pandas 中用 0 填充列

python - 当 Jenkins 启动时,Shell 脚本有不同的行为

python - 包含 GIL 的简单 Python 函数

python - Python 中的 Matlab lsqnonlin

php - 基于 laravel 中的附加数据透视表列进行查询

Mysql查询在两列的基础上动态将行转列

python - 为什么在此实现中递归比迭代更快? (Python 反转链表)

python - Pandas to_sql 所有列为 nvarchar

pandas - 如何根据值对 Pandas 系列进行子集化?