转换Pandas df,缺少从长格式到宽格式的条目

时间:2017-01-23 15:37:11

标签: python pandas formatting pivot-table

我有一个大致相同的Pandas数据框(<body onresize="resizeAgain('.content')"> function resizeAgain(e) { $(e).css('height',''); $(e).height(maxHeight); } function sameSize(e, selector1, selector2) { var slave = $(selector1).height(); var master = $(selector2).height(); var maxHeight = Math.max(slave, master); $(e).height(maxHeight); } sameSize('.content', '.col1', '.col2'); 是日期时间对象):

dt*

我想把它转换成这样的形状:

     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

我尝试过使用以下内容:

None

但这只会使&#34; A&#34;专栏消失。

上述其他变化也失败了:

pd.pivot_table(table, index=["D"], columns=["B"], values=["C","A"], aggfunc=lambda x: ''.join(set(x)))
例如,

这个创建了一个分层列数据框,我无法将其折叠到所需的结构中。

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以使用:

#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

答案 1 :(得分:1)

在计算pivot_table之后,将生成的DF与原来的DF一起加入 D ,以找到 A的第一次出现

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

<强> (OR)

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

两者都屈服:

enter image description here