如何根据具体条件计算Pandas分组在日期上的增量和百分比变化

92vpleto  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一个名为df的数据集,其结构如下:
| 日期|词|总|顶部|
| --|--|--|--|
| 2023年10月14日|Python| 52 | 5 |
| 2023年10月15日|Python| 54 | 9 |
| 2023年10月16日|R| 52 | 2 |
| 2023年10月17日|R| 12 | 1 |
| 2023年10月18日|R| 45 | 1 |
我需要以一种可以创建两个新列的方式操作数据:
“delta_top”列应显示“top”列中该单词从当前日期到上一日期的差异。
“delta_total”列应显示当前日期与前一日期相比该单词的增加或减少百分比。请注意,如果没有以前的日期,我们应该分配“NA”。
例如,对于单词“R”,最早的引用日期是16/10/2023,所以我们不能计算它的“delta_top”或“delta_total”。因此,我们分配“NA”。但是在日期17/10/2023,单词“R”从top 2变为top 1,所以我们从当前值中减去之前的值,结果是1(它上升了1个点)。但是,“delta_total”将显示-0.76,表示小计下降了76%。
我想要的输出看起来像这样:
| 日期|词|总|顶部|三角洲顶|三角洲总量|
| --|--|--|--|--|--|
| 2023年10月14日|Python| 52 | 5 |NA| NA|
| 2023年10月15日|Python| 54 | 9 | 4 |0.037037037|
| 2023年10月16日|R| 52 | 2 |NA| NA|
| 2023年10月17日|R| 12 | 1 | 1 | -0.769230769 |
| 2023年10月18日|R| 45 | 1 | 0 |2.75|
我一直在尝试使用pandas中的chaining方法创建这个表,但总是得到一个错误。事实是,我的实际数据集有超过300万条记录,所以我需要想出一个快速方便的解决方案。我对Python还是个新手。
变通办法:

df = (
    df.assign(date=pd.to_datetime(df['date'], format='%d/%m/%Y'))
      .sort_values(by=['word', 'date'])
      .assign(delta_top=lambda x: x['top'] - x.groupby('word')['top'].shift(1),
              delta_total=lambda x: ((x['total'] - x.groupby('word')['total'].shift(1)) / x.groupby('word')['total'].shift(1)).fillna('NA'))

我觉得我按照一个适当的逻辑方式,但这段代码是永远加载。

bfnvny8b

bfnvny8b1#

试试这个:

grouped = df.groupby('word', as_index=False, group_keys=False)
df['delta_top'] = grouped['top'].apply(lambda x: x.diff().abs())
df['delta_total'] = grouped['total'].apply(lambda x: x.pct_change())
print(df)
>>>
         date    word  total  top  delta_top  delta_total
0  14/10/2023  python     52    5        NaN          NaN
1  15/10/2023  python     54    9        4.0     0.038462
2  16/10/2023       R     52    2        NaN          NaN
3  17/10/2023       R     12    1        1.0    -0.769231
4  18/10/2023       R     45    1        0.0     2.750000
5lhxktic

5lhxktic2#

验证码

按组应用diffpct_change

g = df.groupby('word')
df.assign(delta_top=g['top'].diff().abs(), delta_total=g['total'].pct_change())

相关问题