[英]Pandas: convert df from "wide" to "long" format with col containing dtype object which should be an array
[英]Convert Pandas df with missing entries from long to wide format
我有一個大致像這樣的Pandas數據框(其中dt*
是datetime對象):
A B C D
1 dt1 X 1 1
2 None Y 4 1
3 dt2 X 2 2
4 None Y 8 2
5 None X 3 3
6 None Y 2 3
7 dt3 X 7 4
8 dt3 Y 1 4
我想將其轉換成這樣的形狀:
A X y D
1 dt1 1 4 1
2 dt2 2 8 2
3 None 3 2 3
4 dt3 7 1 4
假設datetime對象是相同的,或者一個是None
。
我嘗試使用以下方法:
pd.pivot_table(table, index=["D"], columns=["B"], values=["C","A"], aggfunc=lambda x: ''.join(set(x)))
但這只會使“ A”列消失。
上面的其他變體也失敗了:
table = table.pivot(index="D", columns='B')
例如,此代碼創建了一個層次列數據框,而我一直無法折疊成所需的結構。
你能幫我嗎?
您可以使用:
#sort values by column A
df = df.sort_values('A', ascending=False)
#replace string 'None' to None if necessary
df.A = df.A.replace({'None': None})
#groupby by column D and forward fill first value in each group
df.A = df.groupby('D', sort=False)['A'].ffill()
#reshape by set_index with unstack
df = df.set_index(['A','D', 'B'])['C'].unstack().reset_index()
#reorder columns, remove column name
df = df[['A','X','Y','D']].rename_axis(None, axis=1)
#if necessary replace NaN to None
df.A = df.A.replace({np.nan: None})
#sort by column D
df = df.sort_values('D')
print (df)
A X Y D
1 dt1 1 4 1
2 dt2 2 8 2
0 None 3 2 3
3 dt3 7 1 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.