【问题标题】:how to count the sum satisfying a condition with Numpy not with Pandas如何用 Numpy 而不是 Pandas 计算满足条件的总和
【发布时间】:2021-06-11 16:52:30
【问题描述】:

我有一个包含 4 列(姓名、性别、出生人数)的数据框,我想计算女性和男性的总数,我必须按性别进行分组。 我已经用这样的熊猫做过了:

names1880.groupby(['Gender']).sum()

我有这样的输出

Gender----|----Births
F         |    166868
----------|------------
M         |    120851

但现在我必须用 Numpy 来做,而不是用 Pandas

【问题讨论】:

标签: python pandas numpy


【解决方案1】:

numpy.bincount 是一个很好的工具,如果你使用出生计数作为权重。但是bincount 要求类别是整数。因此,如果您首先为每种性别创建一个具有不同整数的数组,则可以在 numpy 中执行此操作,如下所示:

import pandas as pd
import numpy as np

names1880 = pd.DataFrame({
    'Name': ['Walter', 'Roger', 'Jane', 'Imelda'],
    'Gender': ['Male', 'Male', 'Female', 'Female'],
    'Births': [100, 200, 120, 220]
})

gender_names, gender_codes = np.unique(
    names1880['Gender'], return_inverse=True
)
print(gender_names)
print(np.bincount(gender_codes, weights=names1880['Births']))

# ['Female' 'Male']
# [340. 300.]

【讨论】:

  • 谢谢,但它不起作用,我有这个错误: ValueError: could not convert string to float: 'F' 。而且我必须对变量进行总和而不是计数:'(
  • @SarahKraiem 我添加了一些代码来首先对性别进行分类,以便 bincount 可以使用它们。请注意,如果您使用出生计数作为权重,bincount 将计算出生计数的总和。
【解决方案2】:

参考此 SO 答案将 pandas DataFrame 转换为 numpy 结构化数组:https://stackoverflow.com/a/51280608/42346

import collections as co, numpy as np, pandas as pd

# my simple test DataFrame
df = pd.DataFrame(co.OrderedDict([('Name',['test','test2','test3']),
                                  ('Gender',['female','male','female']),
                                  ('Number of births',[2,3,4])])) 

# convert pandas DataFrame to numpy structured array 
# credit to this SO answer: https://stackoverflow.com/a/51280608/42346
sarr = np.array([tuple(x) for x in df.values], 
                dtype=list(zip(df.dtypes.index, df.dtypes)))

# finally get the totals by group
for k in np.unique(sarr['Gender']): 
    print(k, sum(sarr[sarr['Gender'] == k]['Number of births']))

结果:

female 6
male 3

【讨论】:

    【解决方案3】:

    最后我做了这个: 计算所有出生人数:

    All_births = names1880.sum()
    

    为了过滤,我这样做了:

    names1880[names1880['Gender'] == "F"].sum()
    

    names1880[names1880['Gender'] == "M"].sum()
    

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 2019-01-20
      • 1970-01-01
      • 2016-05-09
      • 2020-04-09
      • 1970-01-01
      • 2019-03-11
      • 2018-09-20
      • 2021-10-28
      相关资源
      最近更新 更多