Pandas如何使用NaN对数据框进行透视或重塑

4

我有一个数据框需要基于 frame 列进行透视或重塑。

df = {'frame': {0: 0, 1: 1, 2: 2, 3: 0, 4: 1, 5: 2}, 'pvol': {0: nan, 1: nan, 2: nan, 3: 23.1, 4: 24.3, 5: 25.6}, 'vvol': {0: 109.8, 1: 140.5, 2: 160.4, 3: nan, 4: nan, 5: nan}, 'area': {0: 120, 1: 130, 2: 140, 3: 110, 4: 110, 5: 112}, 'label': {0: 'v', 1: 'v', 2: 'v', 3: 'p', 4: 'p', 5: 'p'}}

当前数据框:

frame   pvol    vvol    area    label
0       NaN     109.8   120     v
1       NaN     140.5   130     v
2       NaN     160.4   140     v
0       23.1    NaN     110     p
1       24.3    NaN     110     p
2       25.6    NaN     112     p

期望输出

frame   pvol    vvol    v_area  p_area
0       23.1    109.8   110     110
1       24.3    140.5   110     110
2       25.6    160.4   112     112

前缀vp并不是必要的,我只需要一种方法来区分这些列。

这是我让它工作的方式,但似乎有些冗长。我相信肯定有更好的方法。

for name, tdf in df.groupby('label'):
        df.loc[tdf.index, '{}_area'.format(name)] = tdf['area']

pdf = df[df['label'].eq('p')][['frame', 'label', 'pvol', 'p_area']]
vdf = df[df['label'].eq('v')][['frame', 'vvol', 'v_area']]
df = pdf.merge(vdf, on='frame', how='outer')
3个回答

5

让我们尝试使用“pivot”和“dropna”:

out = df.pivot(index='frame', columns='label').dropna(axis=1)
out.columns = [f'{y}_{x}' for x,y in out.columns]

输出:

       p_pvol  v_vvol  p_area  v_area
frame                                
0        23.1   109.8     110     120
1        24.3   140.5     110     130
2        25.6   160.4     112     140

4

让我们试试

s = df.set_index(['frame','label']).unstack().dropna(axis=1)
s.columns=s.columns.map('_'.join)
s
Out[102]: 
       pvol_p  vvol_v  area_p  area_v
frame                                
0        23.1   109.8     110     120
1        24.3   140.5     110     130
2        25.6   160.4     112     140

2

在看到@BEN_YO和@Quang_Hoang发表的宝贵意见之后,我感到很愚蠢地发布了这篇文章...

df.set_index('label', inplace=True)
d1 = df.loc['v', ['frame', 'vvol', 'area']].rename(columns={'area':'v_area'})
d2 = df.loc['p', ['frame', 'pvol', 'area']].rename(columns={'area':'p_area'})
pd.merge(d1, d2, on='frame')
   frame   vvol  v_area  pvol  p_area
0      0  109.8     120  23.1     110
1      1  140.5     130  24.3     110
2      2  160.4     140  25.6     112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接