当前位置: 首页 > 知识库问答 >
问题:

用每组上一行的值填充缺失的日期,其中包含重复的条目

慕容渊
2023-03-14

我有以下数据帧(示例):

import pandas as pd

data = [['A', '2022-09-01', 2], ['A', '2022-09-02', 1], ['A', '2022-09-04', 3], ['A', '2022-09-06', 2],
        ['A', '2022-09-07', 1], ['A', '2022-09-07', 2], ['A', '2022-09-08', 4], ['A', '2022-09-09', 2],
        ['B', '2022-09-01', 2], ['B', '2022-09-03', 4], ['B', '2022-09-04', 2], ['B', '2022-09-05', 2],
        ['B', '2022-09-07', 1], ['B', '2022-09-08', 3], ['B', '2022-09-10', 2]]
df = pd.DataFrame(data = data, columns = ['group', 'date', 'value'])

df['date'] = pd.to_datetime(df['date'])
df['diff_days'] = (df['date']-df['date'].groupby(df['group']).transform('first')).dt.days

   group       date  value  diff_days
0      A 2022-09-01      2          0
1      A 2022-09-02      1          1
2      A 2022-09-04      3          3
3      A 2022-09-06      2          5
4      A 2022-09-07      1          6
5      A 2022-09-07      2          6
6      A 2022-09-08      4          7
7      A 2022-09-09      2          8
8      B 2022-09-01      2          0
9      B 2022-09-03      4          2
10     B 2022-09-04      2          3
11     B 2022-09-05      2          4
12     B 2022-09-07      1          6
13     B 2022-09-08      3          7
14     B 2022-09-10      2          9

我想用每组前一天的值来填写缺失的日期。我可以使用这个答案中的代码,但问题是我可能在每个组中都有重复的条目(日期)。返回以下错误:

df['date'] = pd.to_datetime(df['date'])

df = df.set_index(
    ['date', 'group']
).unstack(
    fill_value=-999
).asfreq(
    'D', fill_value=-999
).stack().sort_index(level=1).reset_index()

df.replace(-999, np.nan).ffill()

ValueError: Index contains duplicate entries, cannot reshape

我想要的输出应如下所示:

data = [['A', '2022-09-01', 2, 0], ['A', '2022-09-02', 1, 1], ['A', '2022-09-03', 1, 1], ['A', '2022-09-04', 3, 3], 
        ['A', '2022-09-05', 3, 3], ['A', '2022-09-06', 2, 5], ['A', '2022-09-07', 1, 6], ['A', '2022-09-07', 2, 6], 
        ['A', '2022-09-08', 4, 7], ['A', '2022-09-09', 2, 8],
        ['B', '2022-09-01', 2, 0], ['B', '2022-09-02', 2, 0], ['B', '2022-09-03', 4, 2], ['B', '2022-09-04', 2, 3], 
        ['B', '2022-09-05', 2, 4], ['B', '2022-09-06', 2, 4], ['B', '2022-09-07', 1, 6], ['B', '2022-09-08', 3, 7], 
        ['B', '2022-09-09', 3, 7], ['B', '2022-09-10', 2, 9]]
df_desired = pd.DataFrame(data = data, columns = ['group', 'date', 'value', ' diff_days'])

   group        date  value   diff_days
0      A  2022-09-01      2           0
1      A  2022-09-02      1           1
2      A  2022-09-03      1           1
3      A  2022-09-04      3           3
4      A  2022-09-05      3           3
5      A  2022-09-06      2           5
6      A  2022-09-07      1           6
7      A  2022-09-07      2           6
8      A  2022-09-08      4           7
9      A  2022-09-09      2           8
10     B  2022-09-01      2           0
11     B  2022-09-02      2           0
12     B  2022-09-03      4           2
13     B  2022-09-04      2           3
14     B  2022-09-05      2           4
15     B  2022-09-06      2           4
16     B  2022-09-07      1           6
17     B  2022-09-08      3           7
18     B  2022-09-09      3           7
19     B  2022-09-10      2           9

一些日期解释说:

  • A组缺少日期“2022-09-03”和“2022-09-05”。如您所见,这些值来自上一个日期
  • B组缺少日期“2022-09-02”、“2022-09-06”和“2022-009-09”。对于这些,它们还从上一行获取值

所以我想知道是否有人知道如何填补这些缺失的日期,即使每组可能有重复的条目使用< code>Pandas?

共有2个答案

宇文卓
2023-03-14

您可以使用助手列消除重复数据:

(df.assign(n=df.groupby(['group', 'date']).cumcount())
   .pivot(index=['date', 'n'], columns='group')
   .ffill()
   .stack().reset_index()
   .sort_values(by=['group', 'date'], ignore_index=True)
   [df.columns]
)

输出:

   group       date  value  diff_days
0      A 2022-09-01    2.0        0.0
1      A 2022-09-02    1.0        1.0
2      A 2022-09-03    1.0        1.0
3      A 2022-09-04    3.0        3.0
4      A 2022-09-05    3.0        3.0
5      A 2022-09-06    2.0        5.0
6      A 2022-09-07    1.0        6.0
7      A 2022-09-07    2.0        6.0
8      A 2022-09-08    4.0        7.0
9      A 2022-09-09    2.0        8.0
10     A 2022-09-10    2.0        8.0
11     B 2022-09-01    2.0        0.0
12     B 2022-09-02    2.0        0.0
13     B 2022-09-03    4.0        2.0
14     B 2022-09-04    2.0        3.0
15     B 2022-09-05    2.0        4.0
16     B 2022-09-06    2.0        4.0
17     B 2022-09-07    1.0        6.0
18     B 2022-09-07    1.0        6.0
19     B 2022-09-08    3.0        7.0
20     B 2022-09-09    3.0        7.0
21     B 2022-09-10    2.0        9.0
席乐童
2023-03-14
c = ['group', 'date']
m = df[c].duplicated(keep='last')

s = df[~m].set_index('date').groupby('group').resample('D').ffill()
out = pd.concat([df[m], s.droplevel(0).reset_index()]).sort_values(c)
  • 识别每个groupdate
  • 的重复行
  • 删除副本并重新取样数据框并向前填充
  • Concat重复的行与重新采样的行一起获取结果

结果

   group       date  value  diff_days
0      A 2022-09-01      2          0
1      A 2022-09-02      1          1
2      A 2022-09-03      1          1
3      A 2022-09-04      3          3
4      A 2022-09-05      3          3
5      A 2022-09-06      2          5
4      A 2022-09-07      1          6
6      A 2022-09-07      2          6
7      A 2022-09-08      4          7
8      A 2022-09-09      2          8
9      B 2022-09-01      2          0
10     B 2022-09-02      2          0
11     B 2022-09-03      4          2
12     B 2022-09-04      2          3
13     B 2022-09-05      2          4
14     B 2022-09-06      2          4
15     B 2022-09-07      1          6
16     B 2022-09-08      3          7
17     B 2022-09-09      3          7
18     B 2022-09-10      2          9
 类似资料:
  • 我有一个数据集,其中有一些缺失的值,我想用同一组的其他成员填充这些值。但是,在某些情况下,每个组有不止一个值,在这些情况下,我希望复制每个组中的所有行,以便有一行包含每个值。 样本数据: 我最终想要的是: 在某些情况下,组包含一个具有两个值的ID(如组B),而在其他情况下,组中有一个以上的ID,每个ID都有不同的值(如C)。在任何情况下,我都想要一个表,其中组的每个成员都有该组中存在的每个值。我找

  • 我有以下数据帧(示例): 我想在每小时的日期之间填写缺失的日期。因此,应填写日期之间缺少的每一小时,并且值应与之前的数据相同。以下是所需的输出: 所以我想知道是否可以使用每组每小时用列值中的前一个值填充缺失的日期?

  • 问题内容: 这个问题已经在这里有了答案 : MySQL如何填充范围内的缺失日期? (5个答案) 2年前关闭。 我有这个查询,我想用一些值(例如零…)填充缺失的日期。 结果如下: 如何用零值填充缺失的日期?有人有主意吗? 我需要这些数据来进行 图表 预览。 问题答案: 通常,您可以使用以下方法在MySQL中生成一系列N个整数: 请注意,您联接的表(someTable)必须至少具有N行。 上面的-1是

  • 问题内容: 这应该很简单,但是我发现的最接近的内容是这篇文章: pandas:填充组中的缺失值,但我仍然无法解决我的问题。 假设我有以下数据框 我想在每个“名称”组中用平均值填写,即 我不确定要去哪里: 问题答案: 一种方法是使用:

  • 假设我有以下数据。 我想用以前的值填充缺少的日期(按字段“g”分组)。例如,我想在上面的示例中添加以下主菜: 我该怎么做呢?

  • 我有以下数据帧(示例): 我想每组每小时填写缺失的日期,其中值与前一个现有行相同。当前一个现有行的指示符为真时,我想用False而不是真的指示符填充这些缺失的行,但值虽然相同。这是所需的输出: 如您所见,每个组每小时填写一次日期,当上一个指标为True时,指标变为False。 所以我想知道是否有人知道如何每组每小时填写这些缺失的日期,并使用注意指标何时为真?