假设我有以下 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,它不仅包含 True
和 False
值,还包含 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/