簡體   English   中英

熊貓數據框使用np.where並放在一起

[英]pandas dataframe use np.where and drop together

我有一個數據框,我希望能夠使用np.where根據給定條件查找某些元素,然后使用pd.drop刪除與使用np.where找到的索引相對應的元素。

也就是說,

idx_to_drop = np.where(myDf['column10'].isnull() | myDf['column14'].isnull())
myDf.drop(idx_to_drop)

但是我得到一個值錯誤,因為drop不接受numpy數組索引。 有沒有辦法在熊貓中使用np.where和一些drop函數來實現這一目標?

有兩種常見的模式可以實現此目的:


選擇不滿足您的“刪除”條件的行或取消您的條件,然后選擇滿足那些條件的行- @jezrael提供了該方法的一個很好的例子


刪除滿足“刪除”條件的行:

df = df.drop(np.where(df['column10'].isnull() | df['column14'].isnull())[0])

時間 :第一種方法似乎更快一些:

設定:

df = pd.DataFrame(np.random.rand(100,5), columns=list('abcde'))
df.loc[::7, ::2] = np.nan
df = pd.concat([df] * 10**4, ignore_index=True)

In [117]: df.shape
Out[117]: (1000000, 5)

In [118]: %timeit df[~(df['a'].isnull() | df['e'].isnull())]
10 loops, best of 3: 46.6 ms per loop

In [119]: %timeit df[df['a'].notnull() & df['e'].notnull()]
10 loops, best of 3: 39.9 ms per loop

In [120]: %timeit df.drop(np.where(df['a'].isnull() | df['e'].isnull())[0])
10 loops, best of 3: 65.5 ms per loop

In [122]: %timeit df.drop(np.where(df[['a','e']].isnull().any(1))[0])
10 loops, best of 3: 97.1 ms per loop

In [123]: %timeit df[df[['a','e']].notnull().all(1)]
10 loops, best of 3: 72 ms per loop

我認為您需要具有~isnull|逆條件的boolean indexing | (按位or ):

print (~(myDf['column10'].isnull() | myDf['column14'].isnull()))
0    False
1     True
2    False
dtype: bool

myDf[~(myDf['column10'].isnull() | myDf['column14'].isnull())]

樣品:

myDf = pd.DataFrame({'column10':[np.nan, 1,5], 'column14':[np.nan, 1,np.nan]})
print (myDf)
   column10  column14
0       NaN       NaN
1       1.0       1.0
2       5.0       NaN

myDf = myDf[~(myDf['column10'].isnull() | myDf['column14'].isnull())]
print (myDf)
   column10  column14
1       1.0       1.0

使用notnull& (按位and )的解決方案

myDf = myDf[myDf['column10'].notnull() & myDf['column14'].notnull()]
print (myDf)
   column10  column14
1       1.0       1.0

anyall另一種解決方案:

myDf = myDf[~myDf[['column10', 'column14']].isnull().any(axis=1)]
print (myDf)
   column10  column14
1       1.0       1.0

myDf = myDf[myDf[['column10', 'column14']].notnull().all(axis=1)]
print (myDf)
   column10  column14
1       1.0       1.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM