首页 > 解决方案 > 使用熊猫将列作为日期从长到宽

问题描述

我有多个日期的 ID。我想为将标记该 ID 的所有日期创建一个列。我用枢轴试过这个它不起作用。它说它不能使用日期作为列。

data = {'id': [1, 1, 1,  2, 2,], 'dt': ['2021-01-01', '2021-01-02','2021-01-02', '2021-01-02', '2021-01-03']}
df = pd.DataFrame(data)

我采取的另一种方法是创建等级。然后拆开它。但它有很多问题,因为我没有得到排序的日期。

df['rank'] = df.sort_values('dt').groupby('id').cumcount+1
df.set_index(['id', 'dt'], append = True).unstack()

接下来我可以尝试什么?还是有更简单的方法?

标签: pythonpandas

解决方案


如果我理解正确:

尝试:

df['dt']=pd.to_datetime(df['dt'])
df['rank']=df.sort_values('dt').groupby('id').cumcount()+1
df['dt']=df['dt'].astype(str)
df=df.pivot('id','dt','rank').rename_axis(columns=None).reset_index()

输出df

    id  2021-01-01  2021-01-02  2021-01-03
0   1   1.0         2.0         NaN
1   2   NaN         1.0         2.0

或(由于您没有提供预期的输出,所以不确定您想要哪一个)

通过crosstab()

df=pd.crosstab(df['id'],df['dt']).rename_axis(columns=None).reset_index()

输出df

    id  2021-01-01  2021-01-02  2021-01-03
0   1       1       1               0
1   2       0       1               1

推荐阅读