python - Pandas fillna based on a condition
问题描述
I'm still new to pandas, but I have a dataframe in the following format:
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
and I'm trying to fill all NaN fields in the 'd_header' column using the following conditions:
- 'd_header' column should be set only for rows belonging to the same group
- the group should be determined by the 'd_prefix' column value of a row immediately after non-Nan 'd_header' row
So in the following example:
- 0: 'd_header' == '##### MOROCCO #####'
- 1: check 'd_prefix' and set 'd_header' column for all rows going forward to '##### MOROCCO #####' until 'd_prefix' has changed (set value to NaN) OR new 'd_header' found (start over)
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
but I'm not having any luck with this approach. Would there be a better way to achieve the same result?
解决方案
- d_prefix is almost the grouping key you need.
bfill
it thengroupby()
- reduced to simple
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 |
推荐阅读
- jquery - 在 Angular 2 中使用 Jquery 函数调用
- powershell - 编写脚本,从 LastModificationDate 属性按月对文件进行排序
- java - 如何在java中找到5个整数的中位数
- django - Django_tables2 NonType 对象不可迭代
- android - 制作切割字符串android的算法
- visual-studio-code - 视觉工作室代码:在片段中展开片段
- jenkins - Jenkins 在 Jenkins 的不同节点上并行运行测试给了我在步骤中找不到这样的 DSL 方法“代理”
- google-sheets - 如何查看每一行的 ARRAYFORMULA SUMIF?
- python - 在 Mac 上安装 SIP for Python 2.7
- facebook - 在 Facebook Graph API 中指定日期时遇到问题