我有一个这样的数据框
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
中的唯一 values 和 Duration
中的 values 创建新列,然后为每个 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
Q1:有没有更好的方法来做到这一点
Q2:如何将具有相同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
Q1:有没有更好的方法来做这个 Blockquote
A1:是的,使用 https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html
Q2:如何将具有相同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