python dataframe 删除行_python-从pandas DataFrame删除包含空单元格的行

Pythonic +可焊性:df[df['col'].astype(bool)]

空字符串是虚假的,这意味着您可以像这样过滤布尔值:

df = pd.DataFrame({

'A': range(5),

'B': ['foo', '', 'bar', '', 'xyz']

})

df

A B

0 0 foo

1 1

2 2 bar

3 3

4 4 xyz

df['B'].astype(bool)

0 True

1 False

2 True

3 False

4 True

Name: B, dtype: bool

df[df['B'].astype(bool)]

A B

0 0 foo

2 2 bar

4 4 xyz

如果您的目标不仅是删除空字符串,而且还删除仅包含空格的字符串,请事先使用.astype:

df[df['B'].str.strip().astype(bool)]

A B

0 0 foo

2 2 bar

4 4 xyz

比您想像的还要快

.astype是矢量化操作,比到目前为止提供的每个选项都快。 至少从我的测试来看。 YMMV。

这是一个时序比较,我提出了一些我能想到的其他方法。

基准测试代码,以供参考:

import pandas as pd

import perfplot

df1 = pd.DataFrame({

'A': range(5),

'B': ['foo', '', 'bar', '', 'xyz']

})

perfplot.show(

setup=lambda n: pd.concat([df1] * n, ignore_index=True),

kernels=[

lambda df: df[df['B'].astype(bool)],

lambda df: df[df['B'] != ''],

lambda df: df[df['B'].replace('', np.nan).notna()], # optimized 1-col

lambda df: df.replace({'B': {'': np.nan}}).dropna(subset=['B']),

],

labels=['astype', "!= ''", "replace + notna", "replace + dropna", ],

n_range=[2**k for k in range(1, 15)],

xlabel='N',

logx=True,

logy=True,

equality_check=pd.DataFrame.equals)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值