python - pd dataframe 按 id 添加行

标签 python pandas

我有 df,其中包含一些 ID、天数和运行总和:

data = {'id': [0, 0, 0, 1, 1, 2, 1], 'day' : [0, 2, 1, 1, 4, 2, 2], 'running_sum': [1,4,2,1,6,6,3]}
df_1 = pd.DataFrame(data)


    id  day running_sum
0   0   0   1
1   0   2   4
2   0   1   2
3   1   1   1
4   1   4   6
5   2   2   6
6   1   2   3

我想为每个 id 提供所有日期的数据框,并具有正确的运行总和:

    id  day running_sum
0   0   0   1
1   0   1   2
2   0   2   4
3   0   3   4
4   0   4   4
5   1   0   0
6   1   1   1
7   1   2   3
8   1   3   3
9   1   4   6
10  2   0   0
11  2   1   0
12  2   2   6
13  2   3   6
14  2   4   6

感谢帮助

最佳答案

让我们看看这个逻辑是否符合您的想法:

设置idday为索引:

df_1 = df_1.set_index(['id', 'day'])

在引入新数字的同时建立一个新的索引来重新索引df_1;幸运的是索引是唯一的,所以重新索引工作正常:

new_index = df_1.index.get_level_values('id').unique()

new_index = pd.MultiIndex.from_product([new_index, range(5)],
                                       names = ['id', 'day'])

df_1 = df_1.reindex(new_index)

Groupby id 和 filldown 在每个组上,其余的空值将被替换为零:

(df_1.assign(running_sum = df_1.groupby('id')
                               .running_sum
                               .ffill()
                               .fillna(0))
     .reset_index()
)

    id  day  running_sum
0    0    0          1.0
1    0    1          2.0
2    0    2          4.0
3    0    3          4.0
4    0    4          4.0
5    1    0          0.0
6    1    1          1.0
7    1    2          3.0
8    1    3          3.0
9    1    4          6.0
10   2    0          0.0
11   2    1          0.0
12   2    2          6.0
13   2    3          6.0
14   2    4          6.0

如果您不反对使用附加库,complete来自 pyjanitor 的函数/方法可以帮助抽象过程:

# pip install pyjanitor
import pyjanitor
df = df_1.complete('id', {'day':range(5)}) # explicitly expose the missing values

df.assign(running_sum = df.groupby('id').running_sum.ffill().fillna(0))

    id  day  running_sum
0    0    0          1.0
1    0    1          2.0
2    0    2          4.0
3    0    3          4.0
4    0    4          4.0
5    1    0          0.0
6    1    1          1.0
7    1    2          3.0
8    1    3          3.0
9    1    4          6.0
10   2    0          0.0
11   2    1          0.0
12   2    2          6.0
13   2    3          6.0
14   2    4          6.0

所有这些都是基于我的逻辑正确的假设

关于python - pd dataframe 按 id 添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68934288/

相关文章:

python - 将 Python 版本和要求放入 buildozer 规范文件中的正确方法是什么?

python - 归一化二维直方图

python - python中从宽到长的数据操作示例

python - 如何将 Pandas 数据框中的重复项限制为 5 个?

python - 在 PyQt5 中获取滚动条拇指的大小/宽度?

python - 为什么我不能导入 geopandas?

Python Django 电子邮件表单示例

java - 设置变量时Python内联if

python - 如何将同一列中至少共享一个 "1"的所有标签(索引)分组?

python - 如何自动将字符串转换为 Pandas 中的列表或集合?