Python Pandas groupby()和agg()忽略错误

Python Pandas groupby()和agg()忽略错误,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,更新完整性: 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

更新完整性:

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)
这会在日期时间的总和上抛出一个错误。因此,如果dataframe确实有五列,我可以避免这种情况,但我有数百列的dataframe,并且经常构建聚合字典理解,如:

agg_dik = { c : max if 'e' in c else sum for c in cols }
但是,当
groupby().agg()
遇到不允许求和的序列时,它会出错

那么我的问题是——有没有办法实现我想要的结果,但让熊猫要么删除出错列,要么替换为NaN并继续?


我看了其他几个问题(如),但它们并没有完全回答我的问题。

目前有两个问题:

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

  • 某些函数抛出需要捕获的错误/异常。否则,代码的列表行将无法工作

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

    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)
    

    我希望这会有所帮助。

    目前有两个问题:

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

  • 某些函数抛出需要捕获的错误/异常。否则,代码的列表行将无法工作

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

    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)
    

    我希望这能有所帮助。

    鉴于您没有告诉我们为什么和如何使用
    sum
    mean
    函数失败,您最好的选择是编写自定义的
    sum
    mean
    函数,这些函数使用
    try except
    语句来捕获产生错误的情况。@Abdou-我已将问题缩小到
    datetimes
    sum
    。但我认为问题仍然存在。除了在一个函数(表面上是一个循环)内进行尝试之外,是否会首先破坏使用
    .agg()
    函数的目的?您不是在循环。类似于
    def sum_ux的东西:try:return sum(x)除了:return np.nan
    是我想的吗?好的。如果你想给出一个完整的答案,我会尝试一下,如果它有效,我会接受。考虑到你没有告诉我们为什么和如何使用
    sum
    mean
    函数失败,您最好的选择是编写自定义的
    sum
    mean
    函数,这些函数使用
    try except
    语句来捕获产生错误的情况。@Abdou-我已将问题缩小到
    datetimes
    sum
    。但我认为问题仍然存在。除了在一个函数(表面上是一个循环)内进行尝试之外,是否会首先破坏使用
    .agg()
    函数的目的?您不是在循环。类似于
    def sum_ux的东西:try:return sum(x)除了:return np.nan
    是我想的吗?好的。如果你想给出一个完整的答案,我会尝试一下,如果它有效的话,我会接受的。谢谢你的答案-
    日期
    -->
    增量
    只是一个输入错误。但是如果我做了这个修正,我仍然会在charlie上看到NaN,这是我没有预料到的。
    dates
    列确实返回了
    NaN
    ,这很好。修复方法是在
    np.max()
    行中添加一个
    x
    ,并通过将
    max
    更改为
    sum
    日期进行测试。很好,谢谢!感谢您捕获丢失的
    x
    。我很高兴这有帮助。谢谢你的回答,
    dates
    -->
    delta
    只是一个输入错误。但是如果我做了这个修正,我仍然会在charlie上看到NaN,这是我没有预料到的。
    dates
    列确实返回了
    NaN
    ,这很好。修复方法是在
    np.max()
    行中添加一个
    x
    ,并通过将
    max
    更改为
    sum
    日期进行测试。很好,谢谢!感谢您捕获丢失的
    x
    。我很高兴这有帮助。