按ID平坦化数据



我有一个数据表,看起来像这样(注意这是浓缩的,有一些ID与2+ TIMEs):

ID        TIME
1         10:12
1         4:43
2         9:12
3         1:43
3         16:47
4         2:55

我想让它变平,看起来像这样:

ID  Time_1    Time_2
1     10:12    4:43
2     4:43
3     1:43     16:47
4     2:55

我正在查看"扁平化"选项,但还没有找到正确的答案。

https://pandas.pydata.org/pandas-docs/version/0.14.1/generated/pandas.Index.flatten.html

尝试分组并连接您的字符串

new = df.groupby('ID')['TIME'].agg(' '.join).str.split(expand=True)
new.columns = [f'Time_{col+1}' for col in new.columns] # rename columns
Time_1 Time_2
ID              
1   10:12   4:43
2    9:12   None
3    1:43  16:47
4    2:55   None

要格式化为所需的布局,您可以使用.pivot()如下:

(df.assign(serial='Time_'+df.groupby('ID').cumcount().add(1).astype(str))
.pivot(index='ID', columns='serial', values='TIME')
.rename_axis(columns=None)
.reset_index()
)

结果:

ID Time_1 Time_2
0   1  10:12   4:43
1   2   9:12    NaN
2   3   1:43  16:47
3   4   2:55    NaN

如果您希望缺失的值显示为空白,您可以使用:

(df.assign(serial='Time_'+df.groupby('ID').cumcount().add(1).astype(str))
.pivot(index='ID', columns='serial', values='TIME').fillna('')
.rename_axis(columns=None)
.reset_index()
)

结果:

ID Time_1 Time_2
0   1  10:12   4:43
1   2   9:12       
2   3   1:43  16:47
3   4   2:55