您的方法是正确的,但是失败了,因为应用于agg()的函数dict中的每个函数都接收一个Series对象,该对象反映了与键值匹配的列。因此,不必再次过滤列标签。这样,并假设groupby保留顺序,您可以对Series进行切片以提取Open
/ Close列的first / last元素(注意:groupby文档并未声称保留原始数据系列的顺序,但实际上是这样)。
In [50]: df.groupby(dr5minute.asof).agg({'Low': lambda s: s.min(), 'High': lambda s: s.max(), 'Open': lambda s: s[0], 'Close': lambda s: s[-1], 'Volume': lambda s: s.sum()})Out[50]: Close High Low Open Volumekey_0 1999-01-04 10:20:00 1.1806 1.1819 1.1801 1.1801 341999-01-04 10:25:00 1.1789 1.1815 1.1776 1.1807 911999-01-04 10:30:00 1.1791 1.1792 1.1776 1.1780 16
作为参考,以下表格总结了基于groupby对象类型的聚合函数的预期输入和输出类型,以及如何将聚合函数传递到agg()。
agg() method agg func agg func agg() input type accepts returnsresultGroupBy ObjectSeriesGroupBy function Series value Series dict-of-funcs Series value Dataframe, columns match dict keys list-of-funcs Series value Dataframe, columns match func namesDataframeGroupBy function Dataframe Series/dict/ary Dataframe, columns match original Dataframe dict-of-funcs Series value Dataframe, columns match dict keys, where dict keys must be columns in original Dataframe list-of-funcs Series value Dataframe, MultiIndex columns (original cols x func names)
从上表中,如果聚合需要访问多个列,则唯一的选择是将单个函数传递给DataframeGroupBy对象。因此,完成原始任务的另一种方法是定义一个类似如下的函数:
def ohlcsum(df): df = df.sort() return { 'Open': df['Open'][0], 'High': df['High'].max(), 'Low': df['Low'].min(), 'Close': df['Close'][-1], 'Volume': df['Volume'].sum() }
并应用agg():
In [30]: df.groupby(dr5minute.asof).agg(ohlcsum)Out[30]: Open High Low Close Volumekey_0 1999-01-04 10:20:00 1.1801 1.1819 1.1801 1.1806 341999-01-04 10:25:00 1.1807 1.1815 1.1776 1.1789 911999-01-04 10:30:00 1.1780 1.1792 1.1776 1.1791 16
尽管熊猫将来可能会提供一些更简洁的内置魔术,但希望这可以解释如何使用当今的agg()功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)