Python 中 R 中链接样式的数据整理

Data Wrangling in Python in Chaining Style from R

提问人:R_Student 提问时间:9/13/2023 最后编辑:halferR_Student 更新时间:10/15/2023 访问量:48

问:

我是 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 一样灵活和多样化。

Python R 链接 方法-chaining

评论

1赞 Сергей Кох 9/13/2023
由于所有美丽的转换链,您希望从原始数据中得到什么?
0赞 R_Student 9/14/2023
嘿,你好!我想知道如何在 Python 中实现相同的输出,也许以相同的链接风格使用 Pandas、Ponder 或 Polars,但我似乎无法在网上找到有关如何做到这一点的示例。如果你知道并且你能为我提供代码,我将不胜感激

答:

2赞 Merijn van Tilborg 9/13/2023 #1

不确定是否真的受益于将 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

评论

0赞 R_Student 9/14/2023
嗨,Merij,我阅读了您发送的文档,但它并没有回答我的问题,即了解并拥有可以使用 Python 在 R 中复制我的数据的代码,也许 pandas 有一个指南......我知道你们知道很多,而且你们在某些时候也是一个新手,我只想从这个例子中学习......