python - pandas由部分字符串ValueError选择

时间:2015-11-04 06:03:53

标签: python pandas

我有一个csv,我正在加载到数据帧中。我只需要Organization列包含目标字符串affiliation的行。

当我尝试使用str.contains()时,我得到ValueError: cannot index with vector containing NA / NaN values

我查看了Value Error when Slicing in Pandaspandas + 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我没有==Truefillna(False)附加到str.contains()似乎意味着Organization列有{{1} }}。但是,为什么在仅保留非空NaNs行后,我得到相同大小的df?我在这里缺少什么?

谢谢!

2 个答案:

答案 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。