【问题标题】:Pandas map on series熊猫系列地图
【发布时间】:2018-09-28 15:36:52
【问题描述】:

我有一个包含很多类别的 DataFrame,但我只尝试使用两个。我设法得到了我想要的结果,但我的项目没有接受它(“有更好的方法”)。使用 2 列 - Gender (M/F) 和 Showed (1/0) 我试图找出 4 个变量:male1、male0、female1、female0 来用它们创建条形图。

有人告诉我要使用 pd.series.map 函数,但我到处找,找不到一个很好的例子 - 也不确定如何从中获取 4 个变量。

感谢您的帮助。

【问题讨论】:

  • 给出正确的例子来说明 4 个变量的含义
  • 数据框有性别列,男性/女性,显示为 1 表示出现的人,0 表示没有出现的人。试图获取出现的男性数量、未出现的男性数量、出现的女性数量和未出现的女性数量。
  • 请发布示例数据框和预期输出

标签: python python-3.x pandas dataframe series


【解决方案1】:

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

【讨论】:

  • 这就是问题所在——我让它工作了。这不是很好,我只是使用了一个“for”循环并让它工作,但“工作是展示你可以使用内置函数”。无论如何谢谢;)
  • @Coolkidscandie,您应该告诉您的教授/老师,由于用于存储数据的内存模式不同,因此在 Pandas 中使用内置插件通常效率低下。
【解决方案2】:

这似乎是 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

【讨论】:

    【解决方案3】:

    只需 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')   
    

    【讨论】:

    • 是的,我知道这个...问题是我需要使用地图功能来表明我使用的功能很少。不过还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2020-06-03
    • 2016-09-23
    • 2016-06-05
    • 2020-10-05
    • 2019-01-22
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多