簡體   English   中英

將缺少條目的Pandas df從長格式轉換為寬格式

[英]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

在計算了數據pivot_table ,將生成的DF與按D分組的原始DF在一起,以查找A的第一個匹配項。

piv = df.pivot_table(index=['D'], columns=['B'])['C']
piv.join(df.groupby('D')['A'].first()).reset_index().rename_axis([None], axis=1)

(要么)

df.set_index(['D', 'B'])['C'].unstack(1).join(df.groupby('D')['A'].first()).reset_index()

兩種產量:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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