熊猫与groupby分为两列

时间:2017-02-04 23:32:16

标签: python python-3.x pandas

这显然很简单,但作为一只熊猫,我会陷入困境。

我有一个包含3列的CSV文件,State,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)]})

我正在尝试以下操作,但它给了我一个错误:        '没有要连接的对象'

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

我无法弄清楚如何“达到”群组的州级别来获取列的比率。

我希望列的比例为w.r.t状态,就像我想要的输出如下:

    State       ratio

    CA  
    WA  
    CO  
    AZ  

2 个答案:

答案 0 :(得分:8)

或者,声明:您可以创建接受数据帧的自定义函数。 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)

答案 1 :(得分:0)

我相信你首先需要做的是在找到比率之前按州计算。您可以使用apply访问df中的其他列,然后将它们存储在字典中以映射到原始数据框中的相应状态。

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)