Pandas groupby() 和 agg() 忽略错误
Pandas groupby() and agg() ignore errors
更新完整性:
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()
命中不允许求和的系列时,它会出错。
所以我的问题 - 有没有一种方法可以实现我正在寻找的结果,但 pandas 要么删除错误的列,要么替换为 NaN 并继续?
我查看了其他一些问题(例如 this one),但它们没有完全回答我的问题。
手头有两个问题:
您的函数字典可能包含不在您正在使用的数据框中的列。在这种情况下,您将只需要获取其键与数据框中存在的列匹配的元素。
您的一些函数抛出 errors/exceptions 需要被捕获。否则,您的代码列表行将不起作用。
以下是应对这两种情况的解决方案:
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)
希望对您有所帮助。
更新完整性:
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()
命中不允许求和的系列时,它会出错。
所以我的问题 - 有没有一种方法可以实现我正在寻找的结果,但 pandas 要么删除错误的列,要么替换为 NaN 并继续?
我查看了其他一些问题(例如 this one),但它们没有完全回答我的问题。
手头有两个问题:
您的函数字典可能包含不在您正在使用的数据框中的列。在这种情况下,您将只需要获取其键与数据框中存在的列匹配的元素。
您的一些函数抛出 errors/exceptions 需要被捕获。否则,您的代码列表行将不起作用。
以下是应对这两种情况的解决方案:
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)
希望对您有所帮助。