数据框具有如下数据,
Time,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13
05:17:55.703,,,,,,21,,3, 89,891,11,
05:17:55.703,,,,,,21,,3, 217,891,12,
05:17:55.703,,,,,,21,,3, 217,891,13,
05:17:55.703,,,,,,21,,3, 217,891,15,
05:17:55.703,,,,,,21,,3, 217,891,16,
05:17:55.703,,,,,,21,,3, 217,891,17,
05:17:55.703,,,,,,21,,3, 217,891,18,
05:17:55.707,,,,,,18,,3, 185,892,0,
05:17:55.707,,,,,,21,,3, 185,892,1,
05:17:55.707,,,,,,17,,3, 73,892,5,
05:17:55.707,,,,,,17,,3, 185,892,6,
05:17:55.707,,,,,,21,,3, 73,892,7,
05:17:55.708,268,4,28,-67.60,13,,2,,,,,2
05:17:55.711,,,,,,18,,3, 57,892,10,
05:17:55.711,,,,,,21,,3, 201,892,11,
05:17:55.711,,,,,,21,,3, 25,892,12,
05:17:55.723,,,,,,21,,3, 217,893,11,
05:17:55.723,,,,,,21,,3, 217,893,15,
05:17:55.723,,,,,,21,,3, 217,893,16,
05:17:55.726,268,4,,-67.80,,,,,,,,
05:17:55.728,,,28,,12,31,2,3, 185,894,0,1
需要使用不同的agg函数在每一列上进行聚合。就像下面这样。
df['Time'] = pd.to_timedelta(df['Time'])
d = {'Col2':'mean', 'Col3':'max', 'Col5':'median'}
df2 = df.groupby(pd.Grouper(freq='40L', key='Time')).agg(d)
现在,对于另一列,说Col1
,我需要传递如下的自定义模式功能
def mode1(x):
m = pd.Series.mode(x)
return m.values[0] if not m.empty else np.nan
我可以将mode1
添加到字典中,如下所示,聚合可以正常工作。
aggDict = {'Col1': mode1, 'Col2':'mean', 'Col3':'max', 'Col5':'median'}
d = {'Col2':'mean', 'Col3':'max', 'Col5':'median'}
df2 = df.groupby(pd.Grouper(freq='40L', key='Time')).agg(aggDict)
此外,我需要从配置文件中读取此字典,以便将其与具有差异列名称和agg方法的不同数据帧一起使用。
所以我创建了一个配置文件,像下面这样config.ini
,并与ConfigParser
一起使用
config.ini
[Config1]
# for PDSCH and CSF info Apex custom grid
Col1 = mode1
Col2 = mean
Col3 = max
Col4 = median
读取配置文件
from configparser import ConfigParser
cfgparser = ConfigParser()
cfgparser.optionxform = str # to keep case sensitive keys
cfgparser.read('config.ini')
aggDict = dict(cfgparser.items('Config1'))
当我将aggDict传递给.agg()
之类的df2 = df.groupby(pd.Grouper(freq='40L', key='Time')).agg(aggDict)
函数时,它抱怨'SeriesGroupBy' object has no attribute 'mode1'
。
我知道这里的问题-它是aggDict如下图所示(正确地如此)
{'Col1': 'mode1',
'Col2': 'mean',
'Col3': 'max',
'Col4': 'median'}
当mode1
作为字符串传递时,SeriesGroupBy
无法找到它。如何进行处理,以使SeriesGroupBy
从mode1
传递时可以找到用户定义的configParser
函数?
答案 0 :(得分:1)
我认为您需要根据范围从全局变量或本地变量调用它。所以这意味着:
aggDict = {'Col1': globals()['mode1'], 'Col2':'mean', 'Col3':'max', 'Col5':'median'}
您正在做的是正在调用自定义函数以使用globals()
进行传递。这是假设您在相同的类或文件中具有该功能。当您将其解析为aggDict
字典时,请使用上面代码中的格式。