在python / pandas中的R / tidyverse中等效的'spread'和'gather'吗?

时间:2018-10-07 07:50:41

标签: python pandas

例如。 数据A:

userID = my_email_address
API_KEY = my_api_key
# my_api_key was generated under my_email_address on GCP

email_content = CreateMessageWithAttachment(userID, userID, "Test API", "This is a test.", file_dir, filename)
r = requests.post(
    url="https://www.googleapis.com/gmail/v1/users/{}/messages/send?key={}".format(userID, API_KEY),
    data=json.dumps(email_content)
)

if r.status_code == 200:
    print("Succeed!")
else:
    print(r.status_code)

我想将其“聚集”到这个:

y female male
1 2 3
4 5 6

在R语言中很容易。Python熊猫怎么样?

4 个答案:

答案 0 :(得分:1)

您应该尝试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

答案 1 :(得分:0)

尝试从熊猫(pd.melt)中 融化

使用 id_vars 定义您的主要聚集/融化变量; value_vars 来定义您的值变量; var_name 定义值-vars变量的标题;和 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

答案 2 :(得分:0)

聚集

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

传播

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

答案 3 :(得分:0)

这个怎么样:

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 包的作者。如果您对使用有任何疑问,请随时提交问题。