我有一个这样的数据框

df = DataFrame({'Id':[1,2,3,3,4,5,6,6,6],
             'Type': ['T1','T1','T2','T3','T2','T1','T1','T2','T3'],
             'Duration':[5,10,5,7,5,10,15,20,15]})
df
   Id   Type    Duration
0   1   T1      5
1   2   T1      10
2   3   T2      5
3   3   T3      7
4   4   T2      5
5   5   T1      10
6   6   T1      15
7   6   T2      20
8   6   T3      15

我想根据Type中的唯一值和Duration中的值创建新列,然后为每个Id创建一行

col_list = df.Type.unique().tolist()
df[col_list] = nan

def fill_values(duration):
    return duration

for col in col_list:
    df[col] = df['Duration'].loc[df['Type'] == col].apply(fill_values)

Output:
    Id  Type    Duration    T1  T2  T3
0   1   T1      5           5.0 NaN NaN
1   2   T1      10          10.0 NaN NaN
2   3   T2      5           NaN 5.0 NaN
3   3   T3      7           NaN NaN 7.0
4   4   T2      5           NaN 5.0 NaN
5   5   T1      10          10.0 NaN NaN
6   6   T1      15          15.0 NaN NaN
7   6   T2      20          NaN 20.0 NaN
8   6   T3      15          NaN NaN 15.0

问题1:有没有更好的方法

问题2:如何将具有相同Id行的行合并为一行?

预期输出:

   Id   T1  T2  T3
0   1   5   NaN NaN 
1   2   10  NaN NaN 
2   3   NaN 5   7
3   4   NaN 5   NaN 
4   5   10  NaN NaN 
5   6   15  20   15

感谢您的帮助.

推荐答案

问题1:有没有更好的方法

A1:是的,使用pivot_table

问题2:如何将具有相同Id的行合并为一行?

A2:像这样:

df = df.pivot_table(index='Id',columns='Type',values='Duration').rename_axis(None, axis=1).reset_index() 



expected result:

    Id  T1     T2      T3
0   1   5.0    NaN     NaN
1   2   10.0   NaN     NaN
2   3   NaN    5.0     7.0
3   4   NaN    5.0     NaN
4   5   10.0   NaN     NaN
5   6   15.0   20.0    15.0

Python相关问答推荐

将多列拆分为多列,Pandas

Pandas - 添加新列 - 使用循环

将值与列索引 pandas 匹配

如何使代码同时接受 int 和 float 类型的值作为 double 类型? - Python

如何根据 Pandas 中的索引级别设置行值?

Python ImportError: sys.meta_path is None, Python 可能正在关闭

stemmer 和 lemmatizer 似乎都不能很好地工作,我该怎么办?

如何调整for循环的重复?

使用 python 将 messagePack 解析为 Json

根据 url 列表创建合并的 df [pandas]

Visual Studio Code 在“窗口没有响应”之后冻结

我在其中 1 列中有一个带有 json 子字符串的数据框.我想提取变量并为它们制作列

从 json 文件加载项目描述

从 2D numpy 数组中提取多组行/列

从 pandas 1.1.5 升级到最新版本

如何确保 A 和 Bcsign 中至少有一个出现在正则表达式中?

是否有通用的正则表达式方法可以结合这些条件?

有没有一种好方法可以将 pandas 列多索引转换为列类别?

Pandas:使用两个数据帧执行操作

mypy - 如何将行标记为无法访问