簡體   English   中英

Pandas - 從 configParser 傳遞自定義聚合 function

[英]Pandas - passing a custom aggregation function from configParser

dataframe 具有如下數據,

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 function 對每一列進行聚合。 如下所示。

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我需要傳遞一個自定義模式 function 如下所示

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() function 時,例如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找不到它。 如何 go 關於這個,以便SeriesGroupByconfigParser mode1

我認為您需要根據 scope 從全局或本地調用它。 所以這意味着:

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

您正在做的是調用自定義 function 以使用globals()傳遞。 這是假設您在同一個 class 或文件中有 function。 當你把它解析成aggDict字典時,使用上面代碼中的格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM