Python 熊猫数据框.Groupby.Agg'中的自定义列选择;词典

Python 熊猫数据框.Groupby.Agg'中的自定义列选择;词典,python,python-3.x,pandas-groupby,Python,Python 3.x,Pandas Groupby,我在选择要插入Pandas.DataFrame.Groupby.agg中的列时遇到问题 下面是获取和准备数据的代码 #数据收集和库导入 从U数据读取器导入数据 作为pd进口熊猫 符号='AAPL' 来源='雅虎' 开始日期='2018-01-01' 结束日期='2019-04-24' 股票=数据。数据读取器(符号、来源、开始日期、结束日期) 新范围=pd.日期范围(start=“2018-1-1”,end=“2019-12-30”) stock=stock.reindex(新范围).fillna

我在选择要插入Pandas.DataFrame.Groupby.agg中的列时遇到问题

下面是获取和准备数据的代码

#数据收集和库导入
从U数据读取器导入数据
作为pd进口熊猫
符号='AAPL'
来源='雅虎'
开始日期='2018-01-01'
结束日期='2019-04-24'
股票=数据。数据读取器(符号、来源、开始日期、结束日期)
新范围=pd.日期范围(start=“2018-1-1”,end=“2019-12-30”)
stock=stock.reindex(新范围).fillna(方法='ffill').fillna(方法='bfill'))
股票['Day']=stock.index.weekday\u名称
股票['Month']=stock.index.Month_name()
股票['Size']=股票['High'].适用(λx:如果x>175,则为“大”,否则为“小”)
股票['Other Size']=股票['Low'].适用(λx:如果x>175,则为“大”,否则为“小”)
股票。第二轮(2)
总库(10)
导致

到目前为止我所做的是

stock.groupby(['Day', 'Month']).agg(
    {
        'High' : [min, 'mean', max],
        'Low' : [min, 'mean', max],
        'Open' : 'mean',
        'Size' : lambda x: x.value_counts().index[0],
        # Other_non_numeric : lambda x: x.value_counts().index[1],
        # Other_columns : 'mean'
    }
).round(2)
导致

问题是:

  • 如何包含其他非数字列

  • 如何在字典中包含其他未确定的列,并将方法设置为“平均值”

  • 1) 要确定列是否为数字,可以使用

    2) 要查找其余的列,您可以使用
    set(df.columns)
    减去您在
    groupby
    中使用的列以及具有特定agg函数的列,例如

    从pandas.api.types导入的
    是\u数值\u数据类型
    字段\u groupby=['Day','Month']
    字段\u特定={
    “高”:[最小值”、“平均值”、“最大值],
    “低”:[最小值”、“平均值”、“最大值],
    “开放”:“平均值”,
    “大小”:lambda x:x.value_counts().索引[0],
    }
    fields\u other=set(set(stock.columns)-set(fields\u groupby)-set(fields\u specific))
    fields_agg_remaining={col:'mean'如果是数字类型(stock[col]),则lambda x:x.value_counts()。字段中col的索引[1]
    
    在这之后,将
    字段集\u specific
    字段集\u agg\u remaining
    组合为agg字段列表

    agg\u fields=剩余的字段
    聚合字段。更新(特定字段)
    stock.groupby(['Day'、'Month']).agg(agg_字段)。四舍五入(2)
    
    编辑:您可以将所有内容组合在一起,将它们放入dictionary参数中,例如:

    stock.groupby(['Day','Month']).agg(
    {col:
    [min',mean',max]如果列在['High','Low']else中
    'mean'如果列在['Open']else中
    lambda x:x.value_counts().如果列在['Size']else中,则索引[0]
    “平均值”如果是数字类型(股票[col])其他
    lambda x:x.value_counts().set(set(stock.columns)-{'Day','Month'}中列的索引[1]
    ).轮(2)
    
    我喜欢将列拆分为两个数据帧的方式。我的问题是,在dictionary参数中是否有任何可能的方法可以做到这一点?是或否,您需要Dict理解来处理dictionary参数中的动态键,请查看我编辑的答案