Python 数据帧中groupby和conditional之后的除法

Python 数据帧中groupby和conditional之后的除法,python,pandas,Python,Pandas,我有一个df,它有数值评级、当前余额和新到期列。我想按新到期日分组,然后找到与数值评级>0.2相关的当前余额之和除以仅分组后的当前余额之和。我通过使用两个数据帧并将相应的值分割,然后将其放入一个dict d中,以下面的方式进行操作,但我想知道是否有更好的方法: df_rat = df[df['Numeric Rating'] > 0.2] W=df_rat.groupby(['New Maturities']).agg({'Current Balance':'sum'}).reset_in

我有一个
df
,它有
数值评级
当前余额
新到期
列。我想按
新到期日
分组,然后找到与
数值评级>0.2相关的
当前余额
之和除以仅分组后的
当前余额
之和。我通过使用两个数据帧并将相应的值分割,然后将其放入一个
dict d
中,以下面的方式进行操作,但我想知道是否有更好的方法:

df_rat = df[df['Numeric Rating'] > 0.2]
W=df_rat.groupby(['New Maturities']).agg({'Current Balance':'sum'}).reset_index() 
W_=df.groupby(['New Maturities']).agg({'Current Balance':'sum'}).reset_index()
d = {}
for i in list(W['New Maturities']):
    d[str(i)] = W[W['New Maturities'] == i]['Current Balance'].values/W_[W_['New Maturities'] == i]['Current Balance'].values
df
如下所示,共有378行:

import pandas as pd
from io import StringIO

data = '''New Maturities,Current Balance,Numeric Rating
          7,3400000,0.075
          7,1945904,0.200
          5,2000000,0.300
          5,118812,0.400
          5,79208,0.300'''

df = pd.read_csv(StringIO(data), sep = ',', header = 0)

谢谢

改进此方法的一个方法是完全消除for循环

import pandas as pd
from io import StringIO

data = '''New Maturities,Current Balance,Numeric Rating
          7,3400000,0.075
          7,1945904,0.200
          5,2000000,0.300
          5,118812,0.400
          5,79208,0.300'''

df = pd.read_csv(StringIO(data), sep = ',', header = 0)

df_rat = df[df['Numeric Rating'] > 0.2]

W=df_rat.groupby(['New Maturities']).agg({'Current Balance':'sum'}) 
W_=df.groupby(['New Maturities']).agg({'Current Balance':'sum'})

d=W_/W
d
是一个系列,您可以使用
d.to_dict

我所做的就是删除
reset\u索引
,这样这些
W
将保持序列,我们可以允许pandas.series.div使用我们想要的索引,然后使用分割


另一方面,与之关系不大的是自定义agg函数。我说的只是轻微的相关,因为我想不出一种方法来在你的场景中使用它们,而你的方法已经非常直接了。如果它可能引发其他想法,下面是答案。不幸的是,agg函数一次只接受一个序列。

改进此方法的一个方法是完全消除for循环

import pandas as pd
from io import StringIO

data = '''New Maturities,Current Balance,Numeric Rating
          7,3400000,0.075
          7,1945904,0.200
          5,2000000,0.300
          5,118812,0.400
          5,79208,0.300'''

df = pd.read_csv(StringIO(data), sep = ',', header = 0)

df_rat = df[df['Numeric Rating'] > 0.2]

W=df_rat.groupby(['New Maturities']).agg({'Current Balance':'sum'}) 
W_=df.groupby(['New Maturities']).agg({'Current Balance':'sum'})

d=W_/W
d
是一个系列,您可以使用
d.to_dict

我所做的就是删除
reset\u索引
,这样这些
W
将保持序列,我们可以允许pandas.series.div使用我们想要的索引,然后使用分割

另一方面,与之关系不大的是自定义agg函数。我说的只是轻微的相关,因为我想不出一种方法来在你的场景中使用它们,而你的方法已经非常直接了。如果它可能引发其他想法,下面是答案。不幸的是,agg函数一次只接受一个系列