Python 在数据透视时,将两组不同的列视为单个索引和列

Python 在数据透视时,将两组不同的列视为单个索引和列,python,pandas,Python,Pandas,这是我的数据帧: df = pd.DataFrame({'a': list('xyz'), 'freq_a': [1, 2, 3], 'b': list('axy'), 'freq_b': [3, 4, 5], 'c': list('bzy'), 'freq_c': [5, 6, 7]}) df a freq_a b freq_b c freq_c 0 x 1 a 3 b 5 1 y 2 x 4 z

这是我的数据帧:

df = pd.DataFrame({'a': list('xyz'), 'freq_a': [1, 2, 3], 'b': list('axy'), 'freq_b': [3, 4, 5], 'c': list('bzy'), 'freq_c': [5, 6, 7]})
df
   a  freq_a  b  freq_b  c  freq_c
0  x       1  a       3  b       5
1  y       2  x       4  z       6
2  z       3  y       5  y       7
我想对
a
b
c
列中的每个值进行分组,如下面的示例所示,该示例用于值
x

x freq_a 1
  freq_b 4
  freq_c NaN

使用
filter
然后我们
concat
它们,现在的问题就像找到缺少的级别,所以我们使用
stack
+
unstack

s=df.filter(like='freq')
pd.concat([s.stack(),df.drop(s.columns,1).add_prefix('freq_').stack()],1).\
     reset_index(level=1).\
         set_index([1,'level_1']).\
            sort_index(0)[0].unstack().stack(dropna=False)

1  level_1
a  freq_a     NaN
   freq_b     3.0
   freq_c     NaN
b  freq_a     NaN
   freq_b     NaN
   freq_c     5.0
x  freq_a     1.0
   freq_b     4.0
   freq_c     NaN
y  freq_a     2.0
   freq_b     5.0
   freq_c     7.0
z  freq_a     3.0
   freq_b     NaN
   freq_c     6.0

使用
filter
然后我们
concat
它们,现在的问题就像找到缺少的级别,所以我们使用
stack
+
unstack

s=df.filter(like='freq')
pd.concat([s.stack(),df.drop(s.columns,1).add_prefix('freq_').stack()],1).\
     reset_index(level=1).\
         set_index([1,'level_1']).\
            sort_index(0)[0].unstack().stack(dropna=False)

1  level_1
a  freq_a     NaN
   freq_b     3.0
   freq_c     NaN
b  freq_a     NaN
   freq_b     NaN
   freq_c     5.0
x  freq_a     1.0
   freq_b     4.0
   freq_c     NaN
y  freq_a     2.0
   freq_b     5.0
   freq_c     7.0
z  freq_a     3.0
   freq_b     NaN
   freq_c     6.0

您可以重塑形状并旋转。从这里,只需选择您想要的变量

res = (
 df.filter(like='freq')
   .melt()
   .assign(label=df[['a', 'b', 'c']].values.ravel())
   .pivot_table(index='label', columns='variable', values='value', aggfunc='first'))

res

variable  freq_a  freq_b  freq_c
label                          
a            2.0     NaN     NaN
b            3.0     NaN     NaN
x            1.0     4.0     NaN
y            NaN     3.0     6.0
z            NaN     5.0     5.0


您可以重塑形状并旋转。从这里,只需选择您想要的变量

res = (
 df.filter(like='freq')
   .melt()
   .assign(label=df[['a', 'b', 'c']].values.ravel())
   .pivot_table(index='label', columns='variable', values='value', aggfunc='first'))

res

variable  freq_a  freq_b  freq_c
label                          
a            2.0     NaN     NaN
b            3.0     NaN     NaN
x            1.0     4.0     NaN
y            NaN     3.0     6.0
z            NaN     5.0     5.0