我想将我的R代码使用dplyr
包转换为pandas,在那里我分组并执行多个摘要。
下面是我的当前代码:
import pandas as pd
data = pd.DataFrame(
{'col1':[1,1,1,1,1,2,2,2,2,2],
'col2':[1,2,3,4,5,6,7,8,9,0],
'col3':[-1,-2,-3,-4,-5,-6,-7,-8,-9,0]
}
)
result = []
for k,v in data.groupby('col1'):
result.append([k, max(v['col2']), min(v['col3'])])
print pd.DataFrame(result, columns=['col1', 'col2_agg', 'col3_agg'])
字符串
问题:
- 太冗长
- 可能可以优化和高效。(我将一个
for-loop groupby
实现重写为groupby.agg
,性能增强是巨大的)。
在R中,等价的代码是:
data %>% groupby(col1) %>% summarize(col2_agg=max(col2), col3_agg=min(col3))
型
另外,groupby().summarize(newcolumn=max(col2 * col3))
的等价物是什么,即函数是2+列的复合函数的聚合/汇总?
3条答案
按热度按时间lymnna711#
相当于
字符串
是
型
它返回
型
返回的对象是一个pandas.DataFrame,其索引名为
col1
,列名为col2
和col3
。默认情况下,当您对数据pandas进行分组时,会将分组列设置为索引,以实现高效的访问和修改。但是,如果您不希望这样,有两种方法可以将col1
设置为列。as_index=False
:型
reset_index
:型
屈服
型
您还可以将多个函数传递给
groupby.agg
。型
这也返回一个DataFrame,但现在它有一个列的MultiIndex。
MultiIndex对于选择和分组非常方便。下面是一些例子:
在早期(0.20.0之前的版本),可以使用字典来重命名
agg
调用中的列。将返回第二列的最大值
max_col2
:然而,它被弃用,转而支持rename方法:
对于像上面定义的
agg_df
这样的DataFrame,它可能会变得冗长。在这种情况下,您可以使用重命名函数来扁平化这些级别:对于像
groupby().summarize(newcolumn=max(col2 * col3))
这样的操作,您仍然可以通过首先使用assign
添加一个新列来使用agg。这将返回新列和旧列的最大值,但您可以一如既往地对其进行切片。
如果是
groupby.apply
,则会更短:但是,
groupby.apply
将其视为自定义函数,因此不会对其进行向量化。('min','max','min','size'等)是矢量化的,这些是优化函数的别名。您可以将df.groupby('col1').agg('min')
替换为df.groupby('col1').agg(min)
,df.groupby('col1').agg(np.min)
或df.groupby('col1').min()
,它们都将执行相同的函数。当您使用自定义函数时,您不会看到相同的效率。最后,从0.20版本开始,
agg
可以直接在DataFrames上使用,而不必先分组。参见示例here。von4xj4u2#
使用
datar
将R代码转换为python代码非常容易,而无需学习pandas的API:字符串
我是软件包的作者。如果您有任何问题,请随时提交问题。
5jvtdoz23#
查看Pandas文档中给出的并排比较:http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html#grouping-and-summarizing
R's débér
字符串
Pandas
型