在 groupby 索引上应用多个 agg 函数

时间:2021-03-25 16:19:18

标签: python pandas dataframe

我目前有以下维基百科scraper

import wikipedia as wp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Wikipedia __scraper__

wiki_page = 'Climate_of_Italy'
html = wp.page(wiki_page).html().replace(u'\u2212', '-')

def dataframe_cleaning(table_number: int):
    global html
    df = pd.read_html(html, encoding='utf-8')[table_number]
    df.drop(np.arange(5, len(df.index)), inplace=True)
    df.columns = df.columns.droplevel()
    df.drop('Year', axis=1, inplace=True)
    
    find = '\((.*?)\)'
    for i, column in enumerate(df.columns):
        if i>0:
            df[column] = (df[column]
                          .str.findall(find)
                          .map(lambda x: np.round((float(x[0])-32)* (5/9), 2)))
    return df

potenza_df = dataframe_cleaning(3)
milan_df = dataframe_cleaning(4)
florence_df = dataframe_cleaning(6)

italy_df = pd.concat((potenza_df, milan_df, florence_df))

产生以下数据帧:

enter image description here

如您所见,我连接了 DataFrame,这导致了许多重复的行。使用 groupby 我想将所有这些过滤到单个 DataFrame 中并使用 .agg 方法我想确保有 minmax、{ {1}}。我面临的问题是无法逐行应用 mean 方法。我知道这是一个非常简单的问题,但我一直在查看文档,遗憾的是无法弄清楚。

提前感谢您的帮助。

附言抱歉,如果这是一个重复的问题帖子,但我找不到类似的解决方案。

编辑:

添加了所需的输出(注意:是在 excel 上完成的)

enter image description here

1 个答案:

答案 0 :(得分:0)

只是一个快速的更新,我能够实现我想要的目标,但是我无法找到一个好的解决方案。

concat_df = pd.concat((potenza_df, milan_df, florence_df))

italy_df = pd.DataFrame()
for i, index in enumerate(list(set(concat_df['Month']))):
    if i == 0:
        temp_df = concat_df[concat_df['Month'] == index]
        temp_df = temp_df.groupby('Month').agg(np.max)
    if i in range(1, 4):
        temp_df = concat_df[concat_df['Month'] == index]
        temp_df = temp_df.groupby('Month').agg(np.mean)
    if i == 4:
        temp_df = concat_df[concat_df['Month'] == index]
        temp_df = temp_df.groupby('Month').agg(np.min)
    italy_df = italy_df.append(temp_df)

italy_df = italy_df.apply(lambda x: np.round(x, 2))
italy_df

以下代码达到了预期的效果,但是高度依赖于用户的手动配置: enter image description here