【问题标题】:Pandas: drop rows with errorsPandas:删除有错误的行
【发布时间】:2020-05-07 20:02:42
【问题描述】:

我有以下数据框,df_melt:

    MatchID GameWeek        Date              Team  Home        AgainstTeam
0     46605        1  2019-08-09         Liverpool  Home       Norwich City
1     46605        1  2019-08-09      Norwich City  Away          Liverpool
2     46606        1  2019-08-10   AFC Bournemouth  Home   Sheffield United
3     46606        1  2019-08-10  Sheffield United  Away    AFC Bournemouth
4     46607        1  2019-08-10           Burnley  Home        Southampton
..      ...      ...         ...               ...   ...                ...
540   46875       28         TBC               Aston Villa  Home   
541   46875       28         TBC          Sheffield United  Away   

显然有一个问题,“TBC”值在几行中。

如何删除那些有缺陷的行,或者以其他方式修复它?

【问题讨论】:

  • 什么是df_pm、df_melt?您应该始终包含样本数据和预期输出。另一方面,该错误意味着您有多个满足您的条件的项目。因此您可以使用item() 将它们转换为一个数字。
  • @Quang Hoang 编辑了这个问题。希望对您有所帮助。
  • itertuples() 几乎总是尖叫对我来说是不必要的。也许您应该简要介绍您正在尝试做的事情,以及您的预期输出。
  • 我试图简明扼要,但您要求提供补充代码...如果我删除 itertuples(),我会得到 AttributeError: 'str' object has no attribute 'MatchID'
  • @QuangHoang 我在数据中找到了错误的来源。请看上面。愿意回答修复它的最佳方法吗?

标签: python pandas


【解决方案1】:

我假设“待定”意味着游戏预计将在未来某个时间发生(“待确认”)。因此,如果您要在分析中使用日期,我建议您过滤以“TBC”作为日期的行:

df_melt_no_tbc = df_melt[df_melt.Date != "TBC"]

您也可以通过其他几种方式做到这一点!请参阅this post 了解其他一些替代方案。这是完整的输出示例:

>>> import pandas as pd
>>> 
>>> columns =["MatchID", "GameWeek", "Date", "Team", "Home", "AgainstTeam"]
>>> data = [["1", "1", "01-02-2020", "TeamA", "Here", "TeamB"],
...         ["1", "1", "TBC", "TeamB", "Here", "TeamA"]]
>>> df_melt = pd.DataFrame(data, columns=columns)
>>> print(df_melt)
  MatchID GameWeek        Date   Team  Home AgainstTeam
0       1        1  01-02-2020  TeamA  Here       TeamB
1       1        1         TBC  TeamB  Here       TeamA
>>> df_melt_no_tbc = df_melt[df_melt.Date != "TBC"]                                                                     
>>> print(df_melt_no_tbc)
  MatchID GameWeek        Date   Team  Home AgainstTeam
0       1        1  01-02-2020  TeamA  Here       TeamB

【讨论】:

    【解决方案2】:

    您可以使用dateutil 来测试日期的有效性。

    from dateutil.parser import parse
    def is_valid_date(s):
        try:
            parse(s)
            return True
        except:
            return False
    
    df_melt = df_melt[df_melt.Date.apply(is_valid_date)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 2022-01-25
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多