【问题标题】:Pandas fillna based on a conditionPandas 根据条件填充
【发布时间】:2021-06-04 03:19:20
【问题描述】:

我还是 pandas 的新手,但我有一个格式如下的数据框:

    d_title    d_prefix                            d_header d_country d_subtitles  d_season  d_episode
0        NaN        NaN                 ##### MOROCCO #####   Morocco         NaN       NaN        NaN
1     title1         AR                                 NaN       NaN         NaN       NaN        NaN
2     title2         AR                                 NaN       NaN         NaN       NaN        NaN
3        NaN        NaN               ##### MOROCCO 2 #####   Morocco         NaN       NaN        NaN
4     title3         AR                                 NaN       NaN         NaN       NaN        NaN
5        NaN        NaN                 ##### ALGERIA #####   Algeria         NaN       NaN        NaN
6     title4         AR                                 NaN       NaN         NaN       NaN        NaN
7     title5         AR                                 NaN       NaN         NaN       NaN        NaN
8     title6         IT                                 NaN       NaN         NaN       NaN        NaN
9     title7         PL                                 NaN       NaN         NaN       1.0        1.0
10    title8         UK                                 NaN       NaN         NaN       NaN        NaN
11    title9         UK                                 NaN       NaN         NaN       NaN        NaN

我正在尝试使用以下条件填充“d_header”列中的所有 NaN 字段:

  • 'd_header' 列应该只为属于同一组的行设置
  • 该组应由紧跟在非南 'd_header' 行之后的行的 'd_prefix' 列值确定

所以在下面的例子中:

  • 0: 'd_header' == '##### 摩洛哥#####'
  • 1:检查 'd_prefix' 并将所有行的 'd_header' 列设置为 '##### MOROCCO #####' 直到 'd_prefix' 已更改(将值设置为 NaN)或新的 'd_header ' 找到(重新开始)
    d_title    d_prefix                            d_header d_country d_subtitles  d_season  d_episode
0        NaN        NaN                 ##### MOROCCO #####   Morocco         NaN       NaN        NaN
1     title1         AR                 ##### MOROCCO #####       NaN         NaN       NaN        NaN
2     title2         AR                 ##### MOROCCO #####       NaN         NaN       NaN        NaN
3        NaN        NaN             ##### MOROCCO TNT #####   Morocco         NaN       NaN        NaN
4     title3         AR             ##### MOROCCO TNT #####       NaN         NaN       NaN        NaN
5        NaN        NaN                 ##### ALGERIA #####   Algeria         NaN       NaN        NaN
6     title4         AR                 ##### ALGERIA #####       NaN         NaN       NaN        NaN
7     title5         AR                 ##### ALGERIA #####       NaN         NaN       NaN        NaN
8     title6         IT                                 NaN       NaN         NaN       NaN        NaN
9     title7         PL                                 NaN       NaN         NaN       1.0        1.0
10    title8         UK                                 NaN       NaN         NaN       NaN        NaN
11    title9         UK                                 NaN       NaN         NaN       NaN        NaN

但我对这种方法没有任何运气。有没有更好的方法来达到同样的效果?

【问题讨论】:

  • 这可能是重复的。见this

标签: python pandas dataframe conditional-statements nan


【解决方案1】:
  • d_prefix 几乎是您需要的分组键。 bfill 然后groupby()
  • 简化为简单的ffill
df = df.assign(d_header=df.assign(t_prefix=df.d_prefix.fillna(method="bfill"))
 .groupby("t_prefix", as_index=False).apply(lambda dfa: dfa.d_header.fillna(method="ffill"))
 .reset_index(drop=True)
)

d_title d_prefix d_header d_country d_subtitles d_season d_episode
0 nan nan ##### MOROCCO ##### Morocco nan nan nan
1 title1 AR ##### MOROCCO ##### nan nan nan nan
2 title2 AR ##### MOROCCO ##### nan nan nan nan
3 nan nan ##### MOROCCO 2 ##### Morocco nan nan nan
4 title3 AR ##### MOROCCO 2 ##### nan nan nan nan
5 nan nan ##### ALGERIA ##### Algeria nan nan nan
6 title4 AR ##### ALGERIA ##### nan nan nan nan
7 title5 AR ##### ALGERIA ##### nan nan nan nan
8 title6 IT nan nan nan nan nan
9 title7 PL nan nan nan 1 1
10 title8 UK nan nan nan nan nan
11 title9 UK nan nan nan nan nan

【讨论】:

  • 这正是我想要的。谢谢罗伯
猜你喜欢
  • 2017-06-29
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多