【问题标题】:Pandas: Filling missing values, based on particular column, by adding some daysPandas:通过添加一些天数,根据特定列填充缺失值
【发布时间】:2021-03-22 06:35:03
【问题描述】:

我有一个这样的数据框df

[日期:mm/dd/yyyy]

Date           Student_id    subject     Subject_Scores
11/30/2020     1000101       Math           70
NaN            1000101       Physics        75
NaN            1000101       Biology        60
11/25/2020     1000101       Chemistry      49
NaN            1000101       English        80
12/02/2020     1000101       Sociology      50
11/25/2020     1000102       Physics        80
NaN            1000102       Math           90
12/15/2020     1000102       Chemistry      63
NaN            1000103       English        71

假设每次考试之间有 3 天的间隔,我如何为每个单独的 Student_id 添加 4 天 并填写NaN 存在的任何地方? (例如:11/30/2020,如果加上 4 天,我们得到 12/04/2020,如果加上 4 天,我们得到 12/08/2020)

P.S如果日期已经存在于某个列值中,考虑到我们应该添加 4 天并为特定的 Student_id 填充下一个 NaN。 p>

输出date_df 必须如下所示:

Date           Student_id    subject     Subject_Scores
11/30/2020     1000101       Math           70
12/04/2020     1000101       Physics        75
12/08/2020     1000101       Biology        60
11/25/2020     1000101       Chemistry      49
11/29/2020     1000101       English        80
12/02/2020     1000101       Sociology      50
11/25/2020     1000102       Physics        80
11/29/2020     1000102       Math           90
12/15/2020     1000102       Chemistry      63
NaN            1000103       English        71

Please do suggest any code ideas, Thanks for the help, in advance!

【问题讨论】:

  • 最后一个学生 ID 的第一个日期为 NaN 怎么样。你将如何处理那个日期?
  • 由于最后一个Student_id 的第一个日期为NaN,因此无法为该学生随机添加天数。 (如果我们尝试使用 groupby 填充,我猜)。

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

如有必要,首先将date 列转换为日期时间,然后通过GroupBy.cumsumStudent_id 的缺失值创建组,并通过4GroupBy.cumcount 中的多个附加创建天数,并通过@987654323 转换为时间增量@,最后使用GroupBy.ffill 前向填充每组的缺失值并添加时间增量:

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

g = df['Date'].notna().groupby(df['Student_id']).cumsum()
add = pd.to_timedelta(df.groupby([g,'Student_id']).cumcount().mul(4), unit='D')

df['Date'] = df.groupby('Student_id')['Date'].ffill().add(add)
print (df)
        Date  Student_id    subject  Subject_Scores
0 2020-11-30     1000101       Math              70
1 2020-12-04     1000101    Physics              75
2 2020-12-08     1000101    Biology              60
3 2020-11-25     1000101  Chemistry              49
4 2020-11-29     1000101    English              80
5 2020-12-02     1000101  Sociology              50
6 2020-11-25     1000102    Physics              80
7 2020-11-29     1000102       Math              90
8 2020-12-15     1000102  Chemistry              63
9        NaT     1000103    English              71

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多