pandas 函数中的条件

问题描述 投票:0回答:1

我是 Pandas 新手,试图弄清楚如何创建/使用函数,执行简单的 if-else 语句。我编写了以下函数

average_shares()
,但它没有按我的预期工作(因为它应该是为行而不是列编写的,但我不明白/不知道如何修复以下代码。在我会写一个简单的非熊猫世界
for i in range(len(column)): do the following
。在 pandas 教程中,他们没有使用 for 循环,他们使用
apply()
;他们创建了带有参数
row
的函数(为什么不使用 dataframe
df
作为参数?)我尝试做同样的事情,但没有成功,所以总的来说,我只是不知道如何在 pandas 中做一件简单的事情,我希望有人可以告诉我。

df = pd.DataFrame({'id': [1, 1, 1], 'week': [1, 1, 2], 'order': [2, 4, 3]})
df['index'] = df.groupby(['id', 'week']).cumcount()+1 #can be many id-s (not only id=1)
df['share'] = df['order']/df.groupby(['id', 'week'])['order'].transform('sum')
df['len'] = (df.groupby(['id', 'week']))['order'].transform('count')

def average_shares(df):
    if df['repeats']>2:
        df = df[(df['share'])>0.05 & (df['share']<0.95)]
        df['share_1'] = df[df['index']==1].groupby('id')['share'].transform('mean')
        df['share_2'] = df[df['index']==2].groupby('id')['share'].transform('mean')
    elif df['repeats']==2:
        df['share_1'] = df[df['index']==1].groupby('id')['share'].transform('mean')
        df['share_2'] = df[df['index']==2].groupby('id')['share'].transform('mean')
    elif df['repeats']<2:
        df['share_1'] = df['share']
        df['share_2'] = 0
    return df['share_1'], df['share_2']

df['share_1'], df['share_2'] = zip(*df.apply(average_shares, axis=1))

任务听起来像

数据框中有列:id、week、order、share。每周可以重复多次。对于每个 id,share_1 是周中第一次出现的平均份额,share_2 是第二次出现的平均份额。如果对于某些 id 一周重复超过 2 次,则在平均之前,保存份额 >0.97 的行并且 <0.03 are discarded. If some week is not repeated, then the average share of the first occurrence is equal to the share itself, the average share of the second occurrence is 0.

数据如下:

|input        |calculated       |I need to calculate             |
|-------------|-----------------|---------------- ---------------|
|id|week|order|index|share  |len|average share_1 |average share_2|
|--|----|-----|-----|-------|---|----------------|---------------|
|1 |  1 |2    |1    |2/(2+4)|2  |(2/6+1)/2 = 0.66|(4/6+0)/2 =0.33|
|1 |  1 |4    |2    |4/(2+4)|2  |(2/6+1)/2 = 0.66|(4/6+0)/2 =0.33|
|1 |  2 |3    |1    |1      |1  |(2/6+1)/2 = 0.66|(4/6+0)/2 =0.33|
  • len = 同一周的重复次数
  • 索引 = 重复出现的顺序
  • 份额=订单除以周订单总和
  • share_1 = 索引为 1 的周内的平均份额(具有相同的 id)
  • share_2 = 索引为 2 的周之间的平均份额(具有相同的 id)
python pandas numpy control-flow
1个回答
0
投票

当您从标准 Python 过渡到科学 Python(numpy、pandas 等)时,您面临着“矢量化”方法。

事实上,性能来自于这样一个事实:操作是在数组上“一次”完成的……所以只有一种解释,一种鸭子类型。

用数学术语来说,你从小学计算转向线性代数和矩阵;-)

这就是为什么你有 yourarray.mean() 而不是mean(yourarray)。

话虽这么说,如果标准 Python 中有 f(x),则可以 pd.Series.apply(f),但这只是语法糖……

再次阅读 pandas 文档,甚至 numpy,牢记矢量化概念。光明将会来临……

© www.soinside.com 2019 - 2024. All rights reserved.