[英]Pandas map on series
我有一个带有很多类别的DataFrame,但是我只想使用两个。 我设法获得了想要的结果,但是在我的项目中没有被接受(“有更好的方法”)。 使用2列-性别(M / F)和显示(1/0),我尝试获取4个变量:male1,male0,female1,female0,以使用它们创建条形图。
有人告诉我要使用pd.series.map函数,但是到处都找不到,也找不到很好的例子-也不确定如何从中获取4个变量。
谢谢你的帮助。
pd.Series.map
是不必要的。 您可以在此处使用GroupBy
并输出字典:
df = pd.DataFrame([['M', 0], ['M', 1], ['M', 1], ['F', 0], ['F', 0], ['F', 1]],
columns=['Gender', 'Showed'])
d = df.groupby(['Gender', 'Showed']).size().to_dict()
# {('F', 0): 2, ('F', 1): 1, ('M', 0): 1, ('M', 1): 2}
通常,应避免创建数量可变的变量。 词典允许您有效地提取值,例如通过d[('F', 0)]
表示女性性别,显示0。
但是,如果确实必须使用map
,则可以使用pd.Index.map
版本:
d = df.groupby(['Gender', 'Showed']).size()
res = df.drop_duplicates()
res['Counts'] = res.set_index(['Gender', 'Showed']).index.map(d.get)
print(res)
Gender Showed Counts
0 M 0 1
1 M 1 2
3 F 0 2
5 F 1 1
这似乎是crosstab
一种情况(这是一个内置函数:D)
import pandas as pd
df = pd.DataFrame([['M', 0], ['M', 1], ['M', 1], ['F', 0], ['F', 0], ['F', 1]],
columns=['Gender', 'Showed'])
pd.crosstab(df.Gender, df.Showed)
Showed 0 1
Gender
F 2 1
M 1 2
您可以通过4条简单的代码行来完成此操作。
male0 = ((df['Gender'] == 'M') & (df['Showed'] == 0)).sum()
female0 = ((df['Gender'] == 'F') & (df['Showed'] == 0)).sum()
male1 = ((df['Gender'] == 'M') & (df['Showed'] == 1)).sum()
female1 = ((df['Gender'] == 'F') & (df['Showed'] == 1)).sum()
使用apply
,因为您需要两个系列而不是一个系列,所以需要使用apply
。
male0 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'M' and row['Showed'] == 0, axis=1).sum()
female0 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'F' and row['Showed'] == 0, axis=1).sum()
male1 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'M' and row['Showed'] == 1, axis=1).sum()
female1 = df[['Gender', 'Showed']].apply(lambda row: row['Gender'] == 'F' and row['Showed'] == 1, axis=1).sum()
使用groupby
counts = df.groupby(['Gender', 'Showed']).size().reset_index(name='Count')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.