python - 检查 Pandas DataFrame 单元格是否包含特定字符串

标签 python pandas

假设我有以下 Pandas DataFrame:

         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比上面的大很多,但是格式差不多。我对 Pandas 很陌生,但我想我可以通过使用找出文本替换部分 sheet.loc 并循环替换单元格值。

但是,我无法弄清楚如何检查单元格是否包含 EQUITY。似乎 str.contains 是我应该使用的,但我不清楚该怎么做。

谢谢!

最佳答案

import numpy as np
import pandas as pd

df = pd.DataFrame({'a': ['NAN', 'NAN', 'NAN', 'NAN', 'NAN', 'NAN', 'NAN', 'NAN', 'NAN', 'NAN'],
 'b': ['BABA UN EQUITY', '2018', '2017', '2016', 'NAN', '700 HK EQUITY', '2018', '2017', '2016', 'NAN']})

# Make sure that all NaN values are `np.nan` not `'NAN'` (strings)
df = df.replace('NAN', np.nan)
mask = df['b'].str.contains(r'EQUITY', na=True)
df.loc[mask, 'a'] = df['b']
df['a'] = df['a'].ffill()
df.loc[mask, 'a'] = np.nan

产量

                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

上面的一个稍微棘手的一点是 mask 是如何定义的。请注意 str.contains 返回一个 Series,它不仅包含 TrueFalse 值,还包含 NaN:

In [114]: df['b'].str.contains(r'EQUITY')
Out[114]: 
0     True
1    False
2    False
3    False
4      NaN
5     True
6    False
7    False
8    False
9      NaN
Name: b, dtype: object

str.contains(..., na=True) 用于使 NaN 被视为 True:

In [116]: df['b'].str.contains(r'EQUITY', na=True)
Out[116]: 
0     True
1    False
2    False
3    False
4     True
5     True
6    False
7    False
8    False
9     True
Name: b, dtype: bool

一旦有了mask,想法就很简单了:将b中的值复制到a中,无论mask在哪里是的:

df.loc[mask, 'a'] = df['b']

前向填充 a 中的 NaN 值:

df['a'] = df['a'].ffill()

mask 为 True 时用 NaN 替换 a 中的值:

df.loc[mask, 'a'] = np.nan

关于python - 检查 Pandas DataFrame 单元格是否包含特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54508137/

相关文章:

java - 使用内存超过 70% 的代码

.net - .net 中 Python 的 urllib 等效项

python - 使用 Pandas 错位 header 的 CSV 到 Excel

python - 将 df 中的多列追加到列表中

python - 在解析 JSON 文件数据时,根据 Python 中的配置文件中提到的位置添加具有空值的缺失字段

python - pandas - 将列转换为分钟值

python - 计算 Pandas 数据框中的日时差

python - Dask 和字段名称中的多个合并

python - 为什么同一类的两个实例会发生相同的实例变量更改?

python - 根据尾随行在 Pandas 数据框中进行计算