使用groupby对两列进行Pandas除法运算

14

这显然很简单,但作为一个pandas新手,我卡住了。

我有一个包含3列的CSV文件,分别是州、bene_1_count和bene_2_count。

我想计算给定州中“bene_1_count”和“bene_2_count”的比率。

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
           'bene_1_count': [np.random.randint(10000, 99999)
                     for _ in range(12)],
           'bene_2_count': [np.random.randint(10000, 99999)
                     for _ in range(12)]})

我正在尝试以下操作,但是它给出了一个错误:'No objects to concatenate'。

df['ratio'] = df.groupby(['state']).agg(df['bene_1_count']/df['bene_2_count'])

我无法想出如何“到达”聚合操作的状态级别,以便对列进行比率运算。

我想要相对于某个州的列的比率,就像我想要以下输出:

    State       ratio

    CA  
    WA  
    CO  
    AZ  
2个回答

16

换句话说:您可以创建接受数据帧的自定义函数。 groupby将返回子数据帧。 然后,您可以使用apply函数将自定义函数应用于每个子数据帧。

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
           'bene_1_count': [np.random.randint(10000, 99999)
                     for _ in range(12)],
           'bene_2_count': [np.random.randint(10000, 99999)
                     for _ in range(12)]})

def divide_two_cols(df_sub):
    return df_sub['bene_1_count'].sum() / float(df_sub['bene_2_count'].sum())

df.groupby('state').apply(divide_two_cols)

现在假设您想要让每一行都除以其所在组的总和(例如,AZ的总和),并且保留所有原始列。只需调整上面的函数(更改计算并返回整个子数据框):

def divide_two_cols(df_sub):
    df_sub['divs'] = df_sub['bene_1_count'] / float(df_sub['bene_2_count'].sum())
    return df_sub

df.groupby('state').apply(divide_two_cols)

4

我认为您首先需要按州合计计数,然后再找到比例。你可以使用 apply 方法访问数据框中的其他列,然后将它们存储在字典中,以映射到原始数据框中相应的州。

import pandas as pd
import numpy as np
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
            'bene_1_count': [np.random.randint(10000, 99999)
                      for _ in range(12)],
            'bene_2_count': [np.random.randint(10000, 99999)
                      for _ in range(12)]})

ratios = df.groupby('state').apply(lambda x: x['bene_1_count'].sum() /
                                   x['bene_2_count'].sum().astype(float)).to_dict()

df['ratio'] = df['state'].map(ratios)

谢谢,它正在工作...但是它返回了一个系列类型,我想将计算出的比率附加到数据框的列中,例如df['ratio']。 - Sanjeev
我更新了帖子,将比率添加回原始数据框中。这是您要寻找的结果吗? - rtk22

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