我是 Python 新手,来自 R 环境。我喜欢 R 的一件事是能够编写代码,在一个可读的代码块中对数据进行多种转换
但是对我来说,在 Python 中找到这种风格的代码非常困难,我想知道你们中的一些人是否可以指导在哪里可以找到有关该特定风格及其允许的功能的资源和参考。
例如我想转换R的这段代码:
library(dplyr)
iris %>%
select(-Petal.Width) %>% #drops column Ptela.Width
filter(Petal.Length > 2 | Sepal.Width > 3.1) %>% #Selects only rows where Criteria is met
filter(Species %in% c('setosa', 'virginica')) %>% #Filters in Species selected
mutate_if(is.numeric, scale) %>% #Numerical columns are scale into z-scores
mutate(item = rep(1:3, length.out = n())) %>% # a new col item is created and will carry the sequence 1,2,3 until the end of the dataste
group_by(Species) %>% #groups by species
summarise(n = n(), #summarises the size of each group
n_sepal_over_1z = sum(Sepal.Width > 1), #counts the number of obs where Spepal.Width is over 1 z score
nunique_item_petal_over_2z = n_distinct(item[Petal.Length>1]))
#counst the unique elements in the col item where the values of the col Petal.length is over 1 z-score
那一小段代码能够完成我想做的所有事情,但如果我想用 Python 编写它,我似乎找不到一种方法来复制这种编码风格。我得到的最接近的是:
import pandas as pd
from sklearn.preprocessing import StandardScaler
# Load the Iris dataset
iris = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",
header=None, names=["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"])
# Filter and manipulate the data
filtered_data = iris[(iris["Petal.Length"] > 2) | (iris["Sepal.Width"] > 3.1)]
filtered_data = filtered_data[filtered_data["Species"].isin(["setosa", "virginica"])]
# Scale numeric columns using StandardScaler
numeric_columns = filtered_data.select_dtypes(include=[float])
scaler = StandardScaler()
scaled_data = pd.DataFrame(scaler.fit_transform(numeric_columns), columns=numeric_columns.columns)
# Add the "item" column
scaled_data["item"] = list(range(1, 4)) * (len(scaled_data) // 3)
# Group by "Species" and calculate summary statistics
summary_stats = scaled_data.groupby("Species").agg(
n=pd.NamedAgg(column="Sepal.Length", aggfunc="size"),
n_sepal_over_1z=pd.NamedAgg(column="Sepal.Width", aggfunc=lambda x: (x > 1).sum()),
nunique_item_petal_over_2z=pd.NamedAgg(column="item", aggfunc=lambda x: x[scaled_data["Petal.Length"] > 1].nunique())
).reset_index()
print(summary_stats)
如您所见,代码更多。如何用尽可能少的代码在 Python 中用一小块代码实现转换?我是新人,所以我的目的不是比较这两种编程语言,它们本身就很棒,但我只是想看到 Python 在链接或管道风格方面与 R 一样灵活且多样化。
不确定将 R 中使用的库移植到 Python 是否真的受益,但有一些选择。
https://www.r-bloggers.com/2022/05/ Three-packages-that-port-the-tidyverse-to-python/
对于那些喜欢 data.table 的人来说,也有一些选项:
https://datatable.readthedocs.io/en/latest/index.html https://datatable.readthedocs.io/en/latest/manual/comparison_with_rdatatable.html