如何从另一列的值中正向填充一个列的零值?

发布于 2025-01-27 21:09:03 字数 816 浏览 3 评论 0原文

我试图用“ end_daily_count”的上一个索引值填充列中的null值。启动数据集将是:

d = {
    'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
    'beginning_daily_count': [30, 33, 37, 46, None, 7, 1, None, 2],
    'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
    'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}

所需的数据集将是:

d = {
    'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
    'beginning_daily_count': [30, 33, 37, 46, 52, 33, 1, 1, 2],
    'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
    'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}

我尝试使用以下ffill()和iLoc()方法,但无济于事。诚然,我在FFILL和ILOC方面几乎没有经验。

d.iloc[beginning_daily_count.isna()].values = d.iloc[d.end_daily_count- 1].values
d['beginning_daily_count'].transform(lambda x: x.ffill(d['end_daily_count']))

I am trying to fill the null values within column 'beginning_daily_count' with the previous index value from the 'end_daily_count'. The starting dataset would be:

d = {
    'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
    'beginning_daily_count': [30, 33, 37, 46, None, 7, 1, None, 2],
    'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
    'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}

and the desired dataset would be:

d = {
    'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
    'beginning_daily_count': [30, 33, 37, 46, 52, 33, 1, 1, 2],
    'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
    'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}

I have attempted the following ffill() and iloc() methods, but to no avail. I admittedly have little experience with ffill and iloc.

d.iloc[beginning_daily_count.isna()].values = d.iloc[d.end_daily_count- 1].values
d['beginning_daily_count'].transform(lambda x: x.ffill(d['end_daily_count']))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

三岁铭 2025-02-03 21:09:03

>方法可以接受系列作为其第一个参数,因此您可以将其传递给end_daily_count列的移位版本。假设您可以在不同的id s上共享数据:

df['beginning_daily_count'] = df['beginning_daily_count'].fillna(df['end_daily_count'].shift())

print(df)
   id  beginning_daily_count  end_daily_count  foils
0   1                   30.0               33      0
1   1                   33.0               37      0
2   1                   37.0               46      0
3   1                   46.0               52      0
4   1                   52.0               33      0
5   2                    7.0                7      0
6   2                    1.0                1      0
7   2                    1.0                2      1
8   2                    2.0                3      1

The DataFrame.fillna method can accept a series as its first argument, so you can pass it a shifted version of your end_daily_count column. Assuming you are OK with potentially sharing data across different ids:

df['beginning_daily_count'] = df['beginning_daily_count'].fillna(df['end_daily_count'].shift())

print(df)
   id  beginning_daily_count  end_daily_count  foils
0   1                   30.0               33      0
1   1                   33.0               37      0
2   1                   37.0               46      0
3   1                   46.0               52      0
4   1                   52.0               33      0
5   2                    7.0                7      0
6   2                    1.0                1      0
7   2                    1.0                2      1
8   2                    2.0                3      1
盗心人 2025-02-03 21:09:03

您可以带有移位的其他列每组的列(使用 groupby.shiftby.shift 避免从一个组到下一个组泄漏值):

df['beginning_daily_count'] = (df['beginning_daily_count']
                               .fillna(df.groupby('id')['end_daily_count'].shift(),
                                       downcast='infer')
                              )

输出:输出:

   id  beginning_daily_count  end_daily_count  foils
0   1                     30               33      0
1   1                     33               37      0
2   1                     37               46      0
3   1                     46               52      0
4   1                     52               33      0
5   2                      7                7      0
6   2                      1                1      0
7   2                      1                2      1
8   2                      2                3      1

You can fillna the column with the shifted other column per group (using GroupBy.shift to avoid leaking values from one group to the next one):

df['beginning_daily_count'] = (df['beginning_daily_count']
                               .fillna(df.groupby('id')['end_daily_count'].shift(),
                                       downcast='infer')
                              )

output:

   id  beginning_daily_count  end_daily_count  foils
0   1                     30               33      0
1   1                     33               37      0
2   1                     37               46      0
3   1                     46               52      0
4   1                     52               33      0
5   2                      7                7      0
6   2                      1                1      0
7   2                      1                2      1
8   2                      2                3      1

清风无影 2025-02-03 21:09:03

这将查看以前的索引,并在设置better_daily_count替换时找到上一个'end_daily_count'

df.replace(np.nan, 'Replace', inplace=True)
df['beginning_daily_count'] = np.where(df['beginning_daily_count'] == 'Replace', df.iloc[df.index - 1]['end_daily_count'], df['beginning_daily_count'])
df['beginning_daily_count'] = df['beginning_daily_count'].astype(int)
df

This will look at the previous index and find the 'end_daily_count' previous when the beginning_daily_count is set to replace

df.replace(np.nan, 'Replace', inplace=True)
df['beginning_daily_count'] = np.where(df['beginning_daily_count'] == 'Replace', df.iloc[df.index - 1]['end_daily_count'], df['beginning_daily_count'])
df['beginning_daily_count'] = df['beginning_daily_count'].astype(int)
df
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文