【问题标题】:drop empty rows and rows with data did not match in DataFrame pandas删除空行和数据行在 DataFrame pandas 中不匹配
【发布时间】:2020-04-11 16:13:56
【问题描述】:

我有一个如下的数据框:

id        name      passenger       date
5abcdefg  Ani         True         2019-01-01
          # empty rows
Makassar  3          2019-12-01    TRUE
5bcdefgh  Budi       False         2019-11-10
5cdefghi  Rani       True          2019-11-11

我想删除空行和模式与其他行不匹配,然后输出如下:

    id    name      passenger       date
5abcdefg  Ani         True         2019-01-01
5bcdefgh  Budi       False         2019-11-10
5cdefghi  Rani       True          2019-11-11

我试过这样但没用:

if df['id'].empty:
    df['id'].replace('',np.nan, inplace=True)
    df.dropna(subset=['id'], inplace=True)
if not df.empty:
   # doing something
   return True
else:
   return False

有关信息,id 字段始终以 5 开头

知道我应该怎么做吗?

【问题讨论】:

  • 关于您的尝试,您是否阅读过 Pandas 文档或进行过任何研究?

标签: python pandas dataframe


【解决方案1】:
>>> import pandas as pd
>>> import numpy as np
>>> 
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10)
>>> print df

          A         B   Tenant
0 -0.588412 -1.179306    Babar
1 -0.008562  0.725239         
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
4  0.805304 -0.834214         
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes
9  0.066946  0.375640         

Now we replace any empty strings in the Tenants column with np.nan objects, like so:

>>> df['Tenant'].replace('', np.nan, inplace=True)
>>> print df

          A         B   Tenant
0 -0.588412 -1.179306    Babar
1 -0.008562  0.725239      NaN
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
4  0.805304 -0.834214      NaN
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes
9  0.066946  0.375640      NaN
Now we can drop the null values:

>>> df.dropna(subset=['Tenant'], inplace=True)
>>> print df





          A         B   Tenant
0 -0.588412 -1.179306    Babar
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes

【讨论】:

  • 试试这个会有帮助
  • 有帮助,但没有删除 schema 不匹配
【解决方案2】:

您可以将Boolean Indexingstr.startswith 一起使用。

这也将处理“id”列中的空值

df[df['id'].str.startswith('5', na=False)]

【讨论】:

    【解决方案3】:

    您可以这样做以仅获取适合您的架构的匹配项:

    df[(df.passenger.str.contains(r'(?:True|False)')) & (df.name.str.contains(r'(?:[a-zA-Z ]+)')) & (df.date.str.contains(r'(?:\d+-\d+-\d+)'))] 
    
    

    输出:

             id  name passenger        date
    0  5abcdefg   Ani      True  2019-01-01
    2  5bcdefgh  Budi     False  2019-11-10
    3  5cdefghi  Rani      True  2019-11-11
    

    【讨论】:

    • 如果我有更多列,我应该一一定义模式吗?我试图只使用startwith 获取数据
    【解决方案4】:

    一个聪明的技巧是使用coercion 将日期列转换为datetime 数据类型。不是日期的值将被强制为NaT 而不是时间值。然后我们可以保留非空行。意思是去掉 NaN、NaT 和 None。

    # ...
    df['date'] = pd.to_datetime(df['date'], errors='coerce')
    df = df[df['date'].notnull()]
    

    结果:

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2020-09-15
      • 2016-10-26
      • 2021-07-04
      • 2022-06-21
      • 2013-08-12
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多