Python 如何在pandas中将长数据格式转换为宽数据格式
我有长格式的数据,并希望将其转换为具有稀疏数据的宽格式:Python 如何在pandas中将长数据格式转换为宽数据格式,python,pandas,formatting,Python,Pandas,Formatting,我有长格式的数据,并希望将其转换为具有稀疏数据的宽格式: df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000], 'Date':[26018,26017,26016,26010,26009,26009]}) 并通过指定以下各项将其转换为宽格式: 思想是添加辅助列和旋转方式,添加缺少的值,最后将misng值转换为0,并转换为整数: df1 = (df.assign(new = 1)
df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000],
'Date':[26018,26017,26016,26010,26009,26009]})
并通过指定以下各项将其转换为宽格式:
思想是添加辅助列和旋转方式,添加缺少的值,最后将misng值转换为
0
,并转换为整数:
df1 = (df.assign(new = 1)
.pivot('id','Date','new')
.reindex(range(df['Date'].min(), df['Date'].max() + 1), axis=1)
.fillna(0)
.astype(int))
print (df1)
Date 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018
id
1000 1 0 0 0 0 0 0 1 0 1
1001 0 0 0 0 0 0 0 0 1 0
1002 0 1 0 0 0 0 0 0 0 0
1003 1 0 0 0 0 0 0 0 0 0
如果获得:
ValueError:索引包含重复的条目,无法重塑
这意味着在更改的样本数据的最后一行中存在重复项。然后添加:
注意:我的解决方案不计算行数,仅返回
1
如果存在交点id
和Date
否则0如果您也在计算频率,则可以使用交叉表
df1 = pd.crosstab(df['id'], df['Date']).reindex(range(df['Date'].min(), df['Date'].max() + 1), axis=1).fillna(0).astype(int)
df1的输出:
Date 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018
id
1000 1 0 0 0 0 0 0 1 0 1
1001 0 0 0 0 0 0 0 0 1 0
1002 0 1 0 0 0 0 0 0 0 0
1003 1 0 0 0 0 0 0 0 0 0
您可以利用groupby.size
和unstack
。最后,reindex
作为其他解决方案
ix = range(df.Date.min(), df.Date.max()+1)
df_final = (df.groupby(['id', 'Date']).size()
.unstack(fill_value=0)
.reindex(ix, axis=1, fill_value=0))
Out[205]:
Date 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018
id
1000 1 0 0 0 0 0 0 1 0 1
1001 0 0 0 0 0 0 0 0 1 0
1002 0 1 0 0 0 0 0 0 0 0
1003 1 0 0 0 0 0 0 0 0 0
如果使用pivot_table()而不是pivot(),则重复项将被忽略,并且工作正常。不知道为什么@Mrutyunjaya-如果存在重复项,则其计数表示
,如果所有1
值的平均值均为1
。
ix = range(df.Date.min(), df.Date.max()+1)
df_final = (df.groupby(['id', 'Date']).size()
.unstack(fill_value=0)
.reindex(ix, axis=1, fill_value=0))
Out[205]:
Date 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018
id
1000 1 0 0 0 0 0 0 1 0 1
1001 0 0 0 0 0 0 0 0 1 0
1002 0 1 0 0 0 0 0 0 0 0
1003 1 0 0 0 0 0 0 0 0 0