Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用groupby对两列进行划分_Python_Python 3.x_Pandas - Fatal编程技术网

Python 使用groupby对两列进行划分

Python 使用groupby对两列进行划分,python,python-3.x,pandas,Python,Python 3.x,Pandas,这显然很简单,但作为一名熊猫新手,我陷入了困境 我有一个CSV文件,它包含3列,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)

这显然很简单,但作为一名熊猫新手,我陷入了困境

我有一个CSV文件,它包含3列,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'])
我不知道如何“达到”groupby的状态级别以获取列的比率

我想要一个状态的列w.r.t的比率,就像我想要我的输出,如下所示:

    State       ratio

    CA  
    WA  
    CO  
    AZ  

我相信你首先需要做的是在找到比率之前,按州对计数进行求和。您可以使用
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)

或者,声明:您可以创建接受数据帧的自定义函数。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的总和),并保留所有原始列。只需调整上述功能(更改计算并返回整个子数据帧):


谢谢…它正在工作…但是它返回一个系列类型,但是我想将计算出的比率附加到数据帧的列中,比如df['ratio']…我更新了我的帖子,将比率添加回原始数据帧。这就是你想要的结果吗?
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)