pandas for循环根据以前的计算添加新列,并在整个索引为nan时停止添加列

k4emjkb1  于 2023-10-14  发布在  其他
关注(0)|答案(1)|浏览(97)

我有一个DF,看起来有点像这样:

data = data = [['2021-09-01', 100], ['2021-10-01', 200], ['2021-11-01', 300],
           ['2021-12-01', 400], ['2022-01-01', 500], ['2022-02-01', 600],
           ['2022-03-01', 700], ['2022-04-01', 800], ['2022-05-01', 900],
           ['2022-06-01', 1000], ['2022-07-01', 1100], ['2022-08-01', 1200],
           ['2022-09-01', 1300], ['2022-10-01', 1400], ['2022-11-01', 1500],
           ['2022-12-01', 1600], ['2023-01-01', 1700], ['2023-02-01', 1800],
           ['2023-03-01', 1900], ['2023-04-01', 2000], ['2023-05-01', 2100],
           ['2023-06-01', 2200], ['2023-07-01', 2300], ['2023-08-01', 2400]] 

df = pd.DataFrame(data, columns = ['Month Year', 'Sales'])

我试图计算出每月单位销售的购买数量,这遵循一定的购买模式。目前,我正在通过购买模式转移数据集,即首次购买,3个月购买,然后6个月购买。为了计算出这一点,我应用了以下计算:

factor = 0.9
df['Initial Purchase'] = np.where(pd.isnull(df['Sales'] - df['Sales'].shift(3) * factor) , df['Sales'], (df['Sales'] - df['Sales'].shift(3)) * factor)
df['2nd Purchase'] = df['Initial Purchase'].shift(3) * factor
df['3rd Purchase'] = df['2nd Purchase'].shift(6) * factor
df['4th Purchase'] = df['3rd Purchase'].shift(6) * factor
df['5th Purchase'] = df['4th Purchase'].shift(6) * factor
df['6th Purchase'] = df['5th Purchase'].shift(6) * factor

这给了我一个这样的df:
| 年月|销售|初始购买|第二次购买|第三次购买|第四次购买|第五次购买|第六次购买|
| --|--|--|--|--|--|--|--|
| 2021年01月09日| 100 | 100 |楠|楠|楠|楠|楠|
| 2021年01月10日| 200 | 200 |楠|楠|楠|楠|楠|
| 2021年11月1日| 300 | 300 |楠|楠|楠|楠|楠|
| 2021年12月1日星期一| 400 | 270 | 90 |楠|楠|楠|楠|
| 2022年1月1日| 500 | 270 | 180 |楠|楠|楠|楠|
| 2022年02月01日星期一| 600 | 270 | 270 |楠|楠|楠|楠|
| 2022年03月01日| 700 | 270 | 243 |楠|楠|楠|楠|
| 2022年04月01日| 800 | 270 | 243 |楠|楠|楠|楠|
| 2022年05月01日| 900 | 270 | 243 |楠|楠|楠|楠|
| 2019 - 06 - 01| 1000 | 270 | 243 | 81 |楠|楠|楠|
| 2022年07月01日| 1100 | 270 | 243 | 162 |楠|楠|楠|
| 2019 - 08 - 01 00:00:00| 1200 | 270 | 243 | 243 |楠|楠|楠|
| 2022年9月1日| 1300 | 270 | 243 |二百一十八点七|楠|楠|楠|
| 2022年01月10日| 1400 | 270 | 243 |二百一十八点七|楠|楠|楠|
| 2019 - 01 - 11 00:00:00| 1500 | 270 | 243 |二百一十八点七|楠|楠|楠|
| 2022年12月1日| 1600 | 270 | 243 |二百一十八点七|七十二点九|楠|楠|
| 2023年1月1日| 1700 | 270 | 243 |二百一十八点七|一百四十五点八|楠|楠|
| 2019 - 02 - 21| 1800 | 270 | 243 |二百一十八点七|二百一十八点七|楠|楠|
| 2023年01月03日| 1900 | 270 | 243 |二百一十八点七|一百九十六点八三|楠|楠|
| 2019 - 04 - 01| 2000 | 270 | 243 |二百一十八点七|一百九十六点八三|楠|楠|
| 2019 - 05 - 01 00:00:00| 2100 | 270 | 243 |二百一十八点七|一百九十六点八三|楠|楠|
| 2019 - 06 - 21 10:00:00| 2200 | 270 | 243 |二百一十八点七|一百九十六点八三|六十五点六一|楠|
| 2019 - 07 - 01 00:00:00| 2300 | 270 | 243 |二百一十八点七|一百九十六点八三|一百三十一点二二|楠|
| 2023年01月08日| 2400 | 270 | 243 |二百一十八点七|一百九十六点八三|一百九十六点八三|楠|
有谁知道如何使用for循环来实现同样的功能吗?因此,我不必手动计算每次购买,因为最初的购买计算是不同的,然后其他计算取决于前面的计算。也有它结束时,整个列长度在南,因为你可以看到第6次购买是南,不需要。

wvt8vs2t

wvt8vs2t1#

似乎您的主要问题在于创建列名,然后为这些名称赋值。有几条路径可以走,但下面是一个直接的for循环。

name_list = [str(num) + suffixes[num % 100] + " Purchase" for num in range(1, 20)]
name_list[0] = "Initial Purchase"

for counter, col_name in enumerate(name_list):
    if counter == 0:
        df[col_name] = np.where(pd.isnull(df['Sales'] - df['Sales'].shift(3) * factor) , df['Sales'], (df['Sales'] - df['Sales'].shift(3)) * factor)
    elif counter == 1:
        df[col_name] = df[name_list[counter - 1]].shift(3) * factor
    else:
        df[col_name] = df[name_list[counter - 1]].shift(6) * factor

    if df[col_name].isnull().all():
        df.pop(col_name)
        break

感谢this answer创建序数。

相关问题