在Python/pandas中是否有与R/tidyverse中的'spread'和'gather'等效的函数?

8
例如。 数据 A:
y female male
1 2 3
4 5 6

我希望将它“收集”到这里:
y gender value
1 female 2
1 male 3
4 female 5
4 male 6

在R中很容易实现,那么Python的pandas呢?

4个回答

14

你应该尝试使用melt函数,在给定的数据中,它的相反操作称为cast函数,这些melt和cast函数与R语言的reshape2包非常相似:

import pandas as pd    
pd.melt(dt, id_vars="y")

其中dt是您的输入表

输出

#y  variable      value
#1  female          2
#4  female          5
#1  male            3
#4  male            6

我明白你的意思。但是还有一个问题。假设有许多变量:x1、x2...x50、y1、y2。然后我将y1和y2收集到一列中。代码如下:pd.melt(dt, id_vars=['x1','x2'...'x50'],value_vars=['y1','y2']。id_vars输入太多了,在R中不是这样的。你有更方便的方法来输入id_vars吗? - Bin
@Bin 你可以使用melt和cast函数来完成所有操作,这些是旧函数,当你提问时,请尽量详细描述问题。另外,如果你在R中遇到性能问题,建议使用data.table。请参考以下链接:https://seananderson.ca/2013/10/19/reshape/ 和 https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.melt.html。此外,你不需要手动输入列名,可以使用df.columns.tolist()将其保存到一个单独的对象中,并进行相应的操作。 - PKumar

3
这个怎么样?
from datar import f
from datar.tibble import tribble
from datar.tidyr import pivot_longer

df = tribble(
  f.y, f.female, f.male,
  1,   2,        3,
  4,   5,        6
)

pivot_longer(df, [f.female, f.male], names_to="gender")

#    y    name  value
# 0  1  female      2
# 1  4  female      5
# 2  1    male      3
# 3  4    male      6

我是datar软件包的作者。如果您在使用过程中有任何问题,请随时提交问题。


3

汇集

df1=df.melt(id_vars='y')
df1

传播

df2=df1.pivot(index='y', columns='variable')
df2

1
尝试使用pandas(pd.melt)中的melt功能。
使用id_vars定义主要聚合/融合变量;使用value_vars定义值变量;使用var_name定义值变量的标题;使用value_name定义实际值的标题。
看下面的例子:
#Import pandas module
import pandas as pd

# Define the dataframe
DF = pd.DataFrame({'y': [1,4], 'female': [2,5], 'male': [3,6]})

# Gather/melt the data frame
pd.melt(DF, id_vars='y', value_vars=['female', 'male'],var_name='gender',
value_name='value')

这是您的输出的样子:
    y   gender  value
0   1   female  2
1   4   female  5
2   1   male    3
3   4   male    6

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