我有一个csv,我正在加载到数据帧中。我只需要Organization
列包含目标字符串affiliation
的行。
当我尝试使用str.contains()
时,我得到ValueError: cannot index with vector containing NA / NaN values
。
我查看了Value Error when Slicing in Pandas和pandas + dataframe - select by partial string以及以下解决方案,这些解决方案对我有用:
df = df[df['Organization'].str.contains(affiliation)==True]
或
df = df[df['Organization'].str.contains(affiliation).fillna(False)]
但是,作为测试,我这样做了:
print(len(df)) #99228
df = df[pd.notnull(df['Organization'])] #or df = df.dropna(subset=['Organization'])
print(len(df)) #99228
df = df[df['Organization'].str.contains(affiliation).fillna(False)]
print(len(df)) #1605
我的问题是:ValueError
我没有==True
或fillna(False)
附加到str.contains()
似乎意味着Organization
列有{{1} }}。但是,为什么在仅保留非空NaNs
行后,我得到相同大小的df?我在这里缺少什么?
谢谢!
答案 0 :(得分:1)
检查专栏Organization
的内容。它很可能包含字符串和其他数据类型。因此,df['Organization'].str.contains(affiliation)
会为这些值与其他数据类型生成NaN
。您无法使用NaN
进行索引,但需要将其转换为False
。
答案 1 :(得分:1)
您需要指定str.contains('affiliation', na=False)
。 [docs]
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: s = pd.Series(['foo','bar',np.nan,'this contains affiliation','baz',np.nan])
In [4]: s.str.contains('affiliation')
Out[4]:
0 False
1 False
2 NaN
3 True
4 False
5 NaN
dtype: object
In [5]: s.str.contains('affiliation', na=False)
Out[5]:
0 False
1 False
2 False
3 True
4 False
5 False
dtype: bool
然后,您可以使用该布尔数组索引DataFrame。