簡體   English   中英

如何在pandas中將長數據格式轉換為寬數據格式

[英]How to convert long data format to wide data format in pandas

我有長格式的數據,並希望將稀疏數據轉換為寬格式:

df = pd.DataFrame({'id':[1000,1001,1000,1002,1003,1000],
                   'Date':[26018,26017,26016,26010,26009,26009]})

輸入數據

並通過分配將其轉換為寬格式:

輸出數據

想法是添加輔助列,並通過旋轉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

注意:我的解決方案不計算行數,如果存在交叉點idDate 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.sizeunstack 最后, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM