熊猫-从configParser传递自定义聚合函数

时间:2019-10-08 12:15:43

标签: python pandas

数据框具有如下数据,

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无法找到它。如何进行处理,以使SeriesGroupBymode1传递时可以找到用户定义的configParser函数?

1 个答案:

答案 0 :(得分:1)

我认为您需要根据范围从全局变量或本地变量调用它。所以这意味着:

aggDict = {'Col1': globals()['mode1'], 'Col2':'mean', 'Col3':'max', 'Col5':'median'}

您正在做的是正在调用自定义函数以使用globals()进行传递。这是假设您在相同的类或文件中具有该功能。当您将其解析为aggDict字典时,请使用上面代码中的格式。