Python中的Pandas和R中的Dplyr都是灵活的数据争用工具。例如,在R中,使用dplyr可以执行以下操作:
custom_func <- function(col1, col2) length(col1) + length(col2)
ChickWeight %>%
group_by(Diet) %>%
summarise(m_weight = mean(weight),
var_time = var(Time),
covar = cov(weight, Time),
odd_stat = custom_func(weight, Time))
在一个声明中注意如何;
大熊猫也有可能出现这种模式吗?请注意,我有兴趣在一个简短的声明中这样做(所以不要创建三个不同的数据帧,然后加入它们)。
编辑我注意到这个问题被忽视了。如果有人能提到为什么帖子被低估了,我可能有机会改进这个问题。
答案 0 :(得分:3)
使用pandas groupby.apply(),您可以在groupby聚合中运行多个函数。请注意,对于统计功能,您需要安装scipy
。对于自定义函数,需要为分组数据运行类似sum()
的聚合:
def customfct(x,y):
data = x / y
return data.mean()
def f(row):
row['m_weight'] = row['weight'].mean()
row['var_time'] = row['Time'].var()
row['cov'] = row['weight'].cov(row['Time'])
row['odd_stat'] = customfct(row['weight'], row['Time'])
return row
aggdf = df.groupby('Diet').apply(f)
答案 1 :(得分:2)
从版本0.16.0开始,pandas提供了assign()
方法。我不确定它与@akrun提到的pandas-ply究竟有什么比较,但它是大熊猫的一部分。我认为这可以处理你所有的需求,除了可能是groupby部分(或者我可能不知道如何与groupby结合)。
Documentation for pandas assign
受dplyr的mutate动词的启发,DataFrame有一个新的assign()方法。 assign的函数签名只是** kwargs。键是新字段的列名,值是要插入的值(例如,Series或NumPy数组),或者是要在DataFrame上调用的一个参数的函数。插入新值,并返回整个DataFrame(包含所有原始列和新列)。
看看你的示例代码,我不知道怎么做groupby,但你当然可以做这种事情。 (实际上,如果我无法弄明白,我可以发布一个后续问题。)
df.assign( mean_weight = lambda x: x['weight'].mean(),
var_time = lambda x: x['time'].var(),
covar = lambda x: np.cov(x.t1,x.t2)[0,0] )
或者,可以这样做:
df.assign( mean_weight = df['weight'].mean(),
var_time = df['time'].var(),
covar = np.cov(df['t1'],df['t2'])[0,0] )
或者,你可以像这样包含groupby(混合下面的替代方法):
df.assign( mean_weight = df['weight'].groupby(df.diet).transform('mean'),
var_time = lambda x: x['time'].groupby(x['diet']).transform('mean') )
但是你必须做4x而不是1x的小组,所以这不是一个真正令人满意的解决方案...
我会更多地使用该语法,看看我是否可以更接近您的示例(您可能希望提供示例数据以获得更好的答案)。
或者您可以使用标准的groupby技术来获得答案,但我认为它需要多个语句(不能只做一个长链接行)因为复杂性 - 您的一些作业可以与groupby和#39; s agg
但我不认为用户功能可以。
答案 2 :(得分:0)
我带了 datar
来让您将 R 代码翻译成 Python:
>>> from pipda import register_func
>>> from datar.all import f, length, group_by, summarise, mean, var, cov
>>> from datar.datasets import ChickWeight
>>>
>>> @register_func(None)
... def custom_func(col1, col2):
... return length(col1) + length(col2)
...
>>> ChickWeight >> \
... group_by(f.Diet) >> \
... summarise(
... m_weight=mean(f.weight),
... var_time = var(f.Time),
... covar = cov(f.weight, f.Time),
... odd_stat = custom_func(f.weight, f.Time)
... )
Diet m_weight var_time covar odd_stat
<int64> <float64> <float64> <float64> <int64>
0 1 102.645455 45.422397 312.189871 440
1 2 122.616667 45.909722 398.564426 240
2 3 142.950000 45.909722 528.827731 240
3 4 135.262712 45.100618 441.868535 236
我是包的作者。如果您有任何问题,请随时提交问题。