我有一个名为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'))
我觉得我按照一个适当的逻辑方式,但这段代码是永远加载。
2条答案
按热度按时间bfnvny8b1#
试试这个:
5lhxktic2#
验证码
按组应用
diff
和pct_change