Pandas的“partial melt”或“group melt”

6

我有一个像这样的数据框

>>> df = pd.DataFrame([[1,1,2,3,4,5,6],[2,7,8,9,10,11,12]], 
                      columns=['id', 'ax','ay','az','bx','by','bz'])
>>> df
   id  ax  ay  az  bx  by  bz
0   1   1   2   3   4   5   6
1   2   7   8   9  10  11  12

我希望将它转换成类似于这样的东西。

   id name   x   y   z
0   1    a   1   2   3
1   2    a   7   8   9
2   1    b   4   5   6
3   2    b  10  11  12

这是一个非逆置/融合问题,但我不知道任何保留这些分组的融合方法。我知道可以在原始数据框中创建投影,然后连接,但我想知道是否错过了我的工具箱中的一些常见的融合技巧。

3个回答

7
不要使用 stackunstack 来替代 wide_to_long
pd.wide_to_long(df,['a','b'],i='id',j='drop',suffix='\w+').stack().unstack(1)
Out[476]: 
drop   x   y   z
id              
1  a   1   2   3
   b   4   5   6
2  a   7   8   9
   b  10  11  12

7

设置索引、将列转换为多级索引并堆叠

df = df.set_index('id')
df.columns = [df.columns.str[1], df.columns.str[0]]
new_df = df.stack().reset_index().rename(columns = {'level_1': 'name'})

    id  name    x   y   z
0   1   a       1   2   3
1   1   b       4   5   6
2   2   a       7   8   9
3   2   b       10  11  12

0

除了已经很好的答案之外,pivot_longerpyjanitor 可以帮助抽象重塑:

# pip install pyjanitor 
import pandas as pd
import janitor
df.pivot_longer(index = 'id', 
                names_to = ('name', '.value'), 
                names_pattern = r"(.)(.)")
 
   id name   x   y   z
0   1    a   1   2   3
1   2    a   7   8   9
2   1    b   4   5   6
3   2    b  10  11  12


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