【问题标题】:pandas dataframe use np.where and drop together熊猫数据框使用 np.where 并放在一起
【发布时间】:2017-06-28 12:50:35
【问题描述】:

我有一个数据框,我希望能够使用 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 和 pandas 中的一些 drop 函数来实现这一点?

【问题讨论】:

  • 你不能这样做:mask = myDf['column10'].isnull() | myDf['column14'].isnull() 然后myDf[~mask]
  • @Divakar 非常感谢!我可以,我也在寻找某种使用 np.where 的方法,因为它在我可以执行的操作方面非常灵活。我个人也喜欢知道我正在擦除哪些索引。尽管如此,这更像是一个愿望,因为面具看起来很棒!

标签: python pandas numpy


【解决方案1】:

有两种常见的模式可以实现这一点:


选择那些不满足您的“丢弃”条件的行或否定您的条件并选择那些满足这些条件的行 - @jezrael has provided a good example for that approach


删除满足“删除”条件的行:

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

【讨论】:

  • Maxu 你确定吗? There are two common patterns to achieve that: ?我认为这里的 drop 方法比较慢,不推荐。你能添加一些时间吗?我现在离线,只能在手机上,所以我不能这样做。
  • 没错。布尔索引是最快的。
【解决方案2】:

我认为您需要boolean indexing~isnull| 的逆条件@(按位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

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 2020-03-09
    • 1970-01-01
    • 2018-04-16
    • 2013-09-26
    • 1970-01-01
    • 2016-11-29
    • 2021-05-22
    • 2014-10-11
    相关资源
    最近更新 更多