假设我有下面的Pandas数据框:
a b
0 NAN BABA UN EQUITY
1 NAN 2018
2 NAN 2017
3 NAN 2016
4 NAN NAN
5 NAN 700 HK EQUITY
6 NAN 2018
7 NAN 2017
8 NAN 2016
9 NAN NAN
对于b
列中的每个单元格,我想检查它是否包含字符串EQUITY
。如果包含,我想替换a
列中的单元格,下一行用前一个字符串,直到一行是NAN
,以获得编辑后的DataFrame,如下所示:
a b
0 NAN BABA UN EQUITY
1 BABA UN EQUITY 2018
2 BABA UN EQUITY 2017
3 BABA UN EQUITY 2016
4 NAN NAN
5 NAN 700 HK EQUITY
6 700 HK EQUITY 2018
7 700 HK EQUITY 2017
8 700 HK EQUITY 2016
9 NAN NAN
我的实际DataFrame比上面的大得多,但格式是相似的。我在弄清楚如何检查单元格是否包含EQUITY
时遇到了麻烦。似乎我应该使用str.contains
,但我不清楚如何做到这一点。
2条答案
按热度按时间pqwbnv8z1#
收益率
上面有一个有点棘手的地方是
mask
是如何定义的。请注意,str.contains
返回一个Series,它不仅包含True
和False
的值,还包含NaN
:str.contains(..., na=True)
用于使NaN
s被视为True
:有了
mask
之后,想法很简单:将b
中的值复制到a
中,只要mask
为True:向前填充
a
中的NaN值:将
a
中的值替换为NaN,只要mask
为True:zkure5ic2#
1.列表解析比
str.contains
快即使它们是向量化的,Pandas字符串方法也没有优化,所以回退到Python循环通常要快得多,即使是大型 Dataframe 。
例如,以下两个是等价的(然而,无论列的长度如何,列表解析都快了大约3倍):
也就是说,
str.contains
(可以说)可读性要好得多;此外,这两个版本都执行得非常快,并且不太可能成为代码性能的瓶颈。2.多字符串使用
"|".join
要检查某列的行中是否存在字符串列表中的任何字符串,请使用
|
分隔符将它们连接起来,并调用str.contains
:3.可以使用
where()
和mask()
进行过滤通过使用布尔掩码
msk
来屏蔽列b
中的某些值,可以达到最终期望的输出。然后使用ffill()
传播值;最后,使用mask()
删除条件为True的值。