通过使用列值反转列名称来重塑数据框

时间:2021-01-02 18:27:23

标签: python pandas dataframe

我正在尝试重塑 df,以便值成为列,而当前列的名称成为新 df 的值。

这是一个例子。

df1=pd.DataFrame(data=[['v1','v2','v3'],['v4','v3','v1'],[np.nan,'v2','v1'],['v5','v3','v6'],], columns=['A','B','C'], index=['d1','d2','d3','d4'])
df1.index.names=['Day']
df1 # What I have
Out[1]: 
       A   B   C
Day             
d1    v1  v2  v3
d2    v4  v3  v1
d3   NaN  v2  v1
d4    v5  v3  v6
df2=pd.DataFrame(data=[['A','B','C',np.nan,np.nan,np.nan],['C',np.nan,'B','A',np.nan,np.nan],['C','B',np.nan,np.nan,np.nan,np.nan],[np.nan,np.nan,'B',np.nan,'A','C']], columns=['v1','v2','v3','v4','v5','v6'], index=['d1','d2','d3','d4'])
df2.index.names=['Day']
df2 # Desired output
Out[2]: 
     v1   v2   v3   v4   v5   v6
d1    A    B    C  NaN  NaN  NaN
d2    C  NaN    B    A  NaN  NaN
d3    C    B  NaN  NaN  NaN  NaN
d4  NaN  NaN    B  NaN    A    C

我猜有 stack()、unstack() 或 pivot() 吗?

2 个答案:

答案 0 :(得分:2)

尝试,stack 然后 pivot

df1a = df1.stack().reset_index()
df1a.pivot('Day', 0, 'level_1')

输出:

0     v1   v2   v3   v4   v5   v6
Day                              
d1     A    B    C  NaN  NaN  NaN
d2     C  NaN    B    A  NaN  NaN
d3     C    B  NaN  NaN  NaN  NaN
d4   NaN  NaN    B  NaN    A    C

reset_index

df1a.pivot('Day', 0, 'level_1').reset_index()

输出:

0 Day   v1   v2   v3   v4   v5   v6
0  d1    A    B    C  NaN  NaN  NaN
1  d2    C  NaN    B    A  NaN  NaN
2  d3    C    B  NaN  NaN  NaN  NaN
3  d4  NaN  NaN    B  NaN    A    C

答案 1 :(得分:0)

您可以使用 meltpivot 的组合:

(
    df1.melt(ignore_index=False)
    .dropna()
    .pivot(columns="value", values="variable")
    .rename_axis(columns=None)
)

    v1  v2  v3  v4  v5  v6
Day                     
d1  A   B   C   NaN NaN NaN
d2  C   NaN B   A   NaN NaN
d3  C   B   NaN NaN NaN NaN
d4  NaN NaN B   NaN A   C
相关问题