这是我的数据框:
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
答案 0 :(得分:4)
您可以重塑形状并旋转。从那里,只需选择所需的变量即可。
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.loc['x']
variable
freq_a 1.0
freq_b 4.0
freq_c NaN
Name: x, dtype: float64
res.loc[['x']]
variable freq_a freq_b freq_c
label
x 1.0 4.0 NaN
答案 1 :(得分:3)
使用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