首页 > 解决方案 > 如何将 tidyverse 从 R 翻译成 Python 中的 pandas?

问题描述

我正在用 R 和 Python 进行数据分析,以比较它们的差异。目前我正在努力翻译

data %>%
  mutate(pct_leader = ballotsLeader/validBallots) %>%
  group_by(community) %>%
  mutate(mean_pct_leader = mean(pct_leader),
         sd_pct_leader = sd(pct_leader),
         up_pct_leader = mean_pct_leader+2*sd_pct_leader) %>%
  filter(pct_leader > up_pct_leader) %>%
  top_n(5, pct_leader)

进入 Python。

我尝试了以下python代码

grouped = data.assign(pct_leader = lambda x: x['ballotsLeader']/x['validBallots']).groupby('community').assign(mean_pct_leader = lambda x: mean(x['pct_leader']),
           sd_pct_leader = lambda x: stdev(x['pct_leader']),
           up_pct_leader = lambda x: x['mean_pct_leader']+2*x['sd_pct_leader']).query('pct_leader > up_pct_leader').pct_leader.nlargest(5)

但得到一个AttributeError: 'DataFrameGroupBy' object has no attribute 'assign'错误。

我意识到这是因为 DataFrameGroupBy 对象没有 assign 方法。

如何保留R代码的顺序但将其翻译成python?

编辑:这是我正在使用的数据

| community | province  | municipality | precinct | registeredVoters | emptyBallots | invalidBallots | validBallots | ballotsLeader |
|-----------|-----------|--------------|----------|------------------|--------------|----------------|--------------|---------------|
| GALICIA   | Coruña, A | Ames         | 001 B    | 270              | 3            | 7              | 206          | 129           |
| GALICIA   | Coruña, A | Ames         | 004 A    | 356              | 2            | 7              | 257          | 136           |
| GALICIA   | Coruña, A | Ames         | 002 C    | 296              | 1            | 2              | 214          | 149           |
| GALICIA   | Coruña, A | Ames         | 010 U    | 646              | 15           | 10             | 507          | 189           |
| GALICIA   | Coruña, A | Ames         | 012 B    | 695              | 6            | 8              | 479          | 247           |

标签: pythonrpandas

解决方案


如果没有看到一些数据,很难做到这一点,但这应该有效:

(data.assign(pct_leader=data['ballotsLeader'] / data['validBallots'])
 .groupby('community').agg(
     mean_pct_leader=('pct_leader', 'mean')
     sd_pct_leader=('pct_leader', 'std'),
     up_pct_leader=('pct_leader', lambda x: (x['pct_leader'].mean()+2) * x['pct_leader'].std())
 )
 .query('pct_leader > up_pct_leader')
 .nlargest(5, 'pct_leader')
)

推荐阅读