【问题标题】:Pandas groupby() and agg() ignore errorsPandas groupby() 和 agg() 忽略错误
【发布时间】:2018-04-06 20:05:43
【问题描述】:

为完整性更新:

import pandas as pd

dates = pd.to_datetime(['2017-10-01','2017-10-02','2017-10-03']).tolist()

df = pd.DataFrame({ 
            'day_of_week':['m','t','w'],
            'alpha':[1,2,3],
            'bravo'[4,5,6],
            'charlie':[7,8,9],
            'dates':dates
            })

agg_dik = {'alpha': sum,
           'bravo': sum,
           'charlie': max,
           'dates': sum}

df = df.groupby('day_of_week').agg(agg_dik).reset_index(drop = True)

这会在日期时间的总和上引发错误。因此,如果数据框确实有五列,我可以避免这种情况,但我有数百列的数据框,并且经常构建聚合字典理解,例如:

agg_dik = { c : max if 'e' in c else sum for c in cols }

但是,当groupby().agg() 遇到不允许 sum 的系列时,它会出错。

所以我的问题 - 有没有办法实现我正在寻找的结果,但让 pandas 删除错误列或替换为 NaN 并继续?

我查看了其他一些问题(例如 this one),但它们并没有完全回答我的问题。

【问题讨论】:

  • 鉴于您没有告诉我们 summean 函数失败的原因和方式,最好的办法是编写使用 try-except 的自定义 sum_mean_ 函数它们中的语句以捕获产生错误时的情况。
  • @Abdou - 我已将问题缩小到仅datetimessum。但我认为问题仍然存在。函数(表面上是循环)中的 try-except 是否不会破坏首先使用 .agg() 函数的目的?
  • 你没有循环播放。 def sum_(x): try: return sum(x) except: return np.nan 之类的东西是我在想的吗?
  • 好的。如果您想整理完整的答案,我会尝试并接受它是否有效。

标签: python pandas pandas-groupby


【解决方案1】:

手头有两个问题:

  1. 您的函数字典可能包含不在您正在使用的数据框中的列。在这种情况下,您只需要获取其键与数据框中存在的列匹配的元素。

  2. 您的某些函数会抛出需要捕获的错误/异常。否则,您的代码列表行将不起作用。

以下是应该处理这两种情况的解决方案:

import pandas as pd
import numpy as np

dates = pd.to_datetime(['2017-10-01','2017-10-02','2017-10-03'])

df = pd.DataFrame({ 
            'day_of_week': ['m','t','w'],
            'alpha': [1,2,3],
            'bravo': [4,5,6],
            'charlie': [7,8,9],
            'dates':dates
            })

def sum_(x):
    try:
        return np.sum(x)
    except:
        return np.nan

def max_(x):
    try:
        return np.max(x)
    except:
        return np.nan

agg_dik = {'alpha': sum_,
           'bravo': sum_,
           'charlie': max_,
           'delta': max_}

df = df.groupby('day_of_week').agg({k:v for k,v in agg_dik.items() if k in df}).reset_index(drop = True)

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答 - dates --> delta 只是一个错字。但是,如果我进行了更正,我仍然会在charlie 上得到NaN,这是我没想到的。 dates 列确实返回 NaN,这很棒。修复是在np.max() 行中添加x,并通过将max_ 更改为sum_ 来测试dates。很好,谢谢!
  • 感谢您找到丢失的x。我很高兴这有帮助。
猜你喜欢
  • 2020-03-03
  • 2015-10-30
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2020-06-27
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多