gpt4 book ai didi

python - 通过对选定的行 pandas 应用函数来创建新列

转载 作者:行者123 更新时间:2023-11-30 22:06:18 25 4
gpt4 key购买 nike

我想在大型数据集(300000 行、1500 个唯一 ID)上使用以下函数。并创建两个新列,如下所示。下面的函数在应用于整个数据框 (len(df1)) 时起作用。但我想根据每个唯一 ID 的长度来应用它。

d = {'ID':['a12', 'a12','a12','b33','b33','b33','v55','v55','v55','v55'], 'Exp_A':[2.2,2.2,2.2,3.1,3.1,3.1,1.5,1.5,1.5,1.5], 
'Exp_B':[2.4,2.4,2.4,1.2,1.2,1.2,1.5,1.5,1.5,1.5],
'A':[0,0,0,1,0,1,0,1,0,1], 'B':[0,0,1,0,1,0,1,0,1,0]}
df1 = pd.DataFrame(data=d)

def adj_Apois(row):
i = row.name
if row.A == 1:
return poisson.pmf(row.A, row.Exp_A*(i+1)/len(df1)) * row.Exp_A
else:
return poisson.pmf(row.A, row.Exp_A*(i+1)/len(df1)) * row.Exp_A

def adj_Bpois(row):
i = row.name
if row.B == 1:
return poisson.pmf(row.B, row.Exp_B*(i+1)/len(df1)) * row.Exp_B
else:
return poisson.pmf(row.B, row.Exp_B*(i+1)/len(df1)) * row.Exp_B


df1['New1'] = df1.apply(adj_Apois, axis=1)
df1['New2'] = df1.apply(adj_Bpois, axis=1)

想要的结果

将上面的 df1 替换为唯一 ID 的长度,得到以下结果

    A   B   Exp_A   Exp_B   ID  new1    new2
0 0 0 2.2 2.4 a12 1.05667 1.07839
1 0 0 2.2 2.4 a12 0.50752 0.48455
2 0 1 2.2 2.4 a12 0.24377 0.86271
3 1 0 3.1 1.2 b33 1.13981 0.80438
4 0 1 3.1 1.2 b33 0.39248 0.43136
5 1 0 3.1 1.2 b33 0.43292 0.36143
6 0 1 1.5 1.5 v55 1.03093 0.3866
7 1 0 1.5 1.5 v55 0.53141 0.70855
8 0 1 1.5 1.5 v55 0.48698 0.54785
9 1 0 1.5 1.5 v55 0.50204 0.33469

如果有任何帮助,我将不胜感激。

最佳答案

IIUC,只需使用 poisson.pmf直接

from spicy.stats import poisson

df1['New2a'] = poisson.pmf(df1.B, df1.Exp_B*(df1.index+1)/len(df1)) * df1.Exp_B
df1['New1a'] = poisson.pmf(df1.A, df1.Exp_A*(df1.index+1)/len(df1)) * df1.Exp_A

产生相同的结果

>>> df1['New1a'].eq(df1['New1']).all()
True
<小时/>

分组:

>>> df1.groupby('ID').apply(lambda s: poisson.pmf(s.B, s.Exp_B*(s.index+1)/len(s)) * s.Exp_B).reset_index()

关于python - 通过对选定的行 pandas 应用函数来创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52766421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com