我想删除某个列的空白行,然后对该列进行过滤:
如果我这样做:
df['location'].dropna(inplace=True)
dfloc = df[df['location'] == myvar]
然后我收到此错误:
IndexingError: Unalignable boolean Series key provided
所以我必须使用这样的dropna来避免错误:
df.dropna(subset = ['location'],inplace=True)
dfloc = df[df['location'] == myvar]
有谁知道为什么第一种方法产生错误而第二种方法没有产生错误?
以下是我的DataFrame示例:
uid date location
1 1114-104119 2017-11-14 10:41:19 Chicago
2 1114-104056 2017-11-14 10:40:56 NaN
3 1114-104055 2017-11-14 10:40:55 LA
4 1114-103223 2017-11-14 10:32:23 NaN
5 1114-103050 2017-11-14 10:30:50 NYC
答案 0 :(得分:1)
第一种方法,正在发生的是您正在创建原始数据框的副本或切片并从该系列中删除行,您实际上并未影响原始数据帧。现在,当您尝试使用该受损系列对原始数据帧进行切片时,该系列的索引与原始数据帧的索引不匹配。因此,错误
IndexingError:提供了无法对齐的布尔系列键
这是证明。
df = pd.DataFrame({'Location':[1,np.nan,3,np.nan],'A':np.random.randint(0,10,4)})
df
A Location
0 7 1.0
1 6 NaN
2 1 3.0
3 8 NaN
df['Location'].dropna(inplace=True)
print(df['Location'])
0 1.0
2 3.0
Name: Location, dtype: float64
但是,如果再次打印df,则会获得完整的数据帧,但您尚未修改此数据帧。
print(df)
A Location
0 7 1.0
1 6 NaN
2 1 3.0
3 8 NaN
在第二种方法中,您要根据子集选择在oringal数据帧上执行下拉。因此,该方法有效,您可以使用该系列对数据帧进行布尔索引。