【问题标题】:Create new columns by applying a function on selected rows pandas通过在选定的行 Pandas 上应用函数来创建新列
【发布时间】:2018-10-11 18:05:41
【问题描述】:

我想在具有 1500 个唯一 ID 的 300000 行的大型数据集上使用以下函数。并创建两个新列,如下所示。下面的函数在应用于整个数据框 (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

我将不胜感激。

【问题讨论】:

  • 如果使用函数的结果是正确的,那你的问题是什么?
  • 你的意思是 if 和 else 的代码相同吗?
  • @G.Anderson,很抱歉没有把问题说清楚,请参阅编辑。

标签: python pandas dataframe apply poisson


【解决方案1】:

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()

【讨论】:

  • 如果泊松函数内部的长度是与Exp_A或Exp_B关联的唯一ID的长度呢?
  • @MatN 不确定我明白,但你可以groupby。检查编辑
  • groupby 的输出与上述不同。
  • s.Exp_B.index 解决它。感谢您对拉斐尔的帮助。
  • @MatN 很高兴你能解决这个问题,我能帮上点忙!快乐编码!
猜你喜欢
  • 2016-01-23
  • 2021-07-26
  • 2022-08-13
  • 2018-11-10
  • 1970-01-01
  • 2016-06-15
  • 2021-02-11
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多