[英]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 關於這個,以便SeriesGroupBy
從configParser
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.