[英]How to convert long data format to wide data format in pandas
想法是添加輔助列,並通過旋轉DataFrame.pivot
,添加缺少的值DataFrame.reindex
和最后一個轉換misisng值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:索引包含重復條目,無法重塑
這意味着在更改的樣本數據的最后一行中存在重復項。 然后添加DataFrame.drop_duplicates
:
df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000, 1000],
'Date':[26018,26017,26016,26010,26009,26009, 26009]})
df1 = (df.assign(new = 1)
.drop_duplicates(subset=['id','Date'])
.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
注意:我的解決方案不計算行數,如果存在交叉點id
和Date
else 0
,則僅返回1
。
如果您還計算頻率,您可以使用crosstab
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.