От R до Python: определите несколько столбцов из нескольких столбцов в кадре данных pandas - PullRequest
1 голос
/ 30 апреля 2019

Как пользователь R, я могу манипулировать столбцами в data.table для получения набора новых столбцов, каков наилучший способ достичь этого с помощью pandas datafframes?

Вот воспроизводимый пример (я использую R 3.2.5 и Python 3.6):

R код:

library(data.table)

df = data.table(iris)
df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]


df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]

Последняя команда вернет:

> df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]
       ratio1   ratio2
  1: 1.457143 7.000000
  2: 1.633333 7.000000
  3: 1.468750 6.500000
  4: 1.483871 7.500000
  5: 1.388889 7.000000
 ---                  
146: 2.233333 2.260870
147: 2.520000 2.631579
148: 2.166667 2.600000
149: 1.823529 2.347826
150: 1.966667 2.833333

Код Python:

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

pd.DataFrame(list(df.apply(lambda x: {'ratio1':x['sepal length (cm)']/x['sepal width (cm)'], 'ratio2':x['petal length (cm)']/x['petal width (cm)']}, axis=1)))

Последняя команда вернет:

In[6]: pd.DataFrame(list(df.apply(lambda x: {'ratio1':x['sepal length (cm)']/x['sepal width (cm)'], 'ratio2':x['petal length (cm)']/x['petal width (cm)']}, axis=1)))
Out[6]: 
       ratio1     ratio2
0    1.457143   7.000000
1    1.633333   7.000000
2    1.468750   6.500000
3    1.483871   7.500000
4    1.388889   7.000000
5    1.384615   4.250000

Вот мой вопрос: моя реализация Python кажется мне неэффективной. Я вычисляю ряд словарей, проектирую их в список и затем вызываю конструктор DataFrame. Другими словами, это не прямое манипулирование с фреймов данных на фреймы данных. Это переводит в подробный код: последняя строка фрагмента R - 76 символов, последняя строка Python - 158.

Есть ли лучший способ сделать это? Спасибо!

P.S. Обратите внимание, что я не хочу постоянно добавлять производные столбцы (ratio1, ratio2 в примере) в исходный набор данных. Я хочу вычислить что-то на лету и построить его или объединить без изменения данных.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вам не нужны методы list() или apply():

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

pd.DataFrame({"ratio1": df['sepal length (cm)']/df['sepal width (cm)'], "ratio2": df['petal length (cm)']/df['petal width (cm)']})

Если вы хотите, чтобы переменные были добавлены в исходный набор данных, вы можете использовать метод assign().

0 голосов
/ 03 мая 2019

Просто немного известной жемчужины, чтобы сделать такие вещи, попробуйте следующее:

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# replace spaces and parentheses in column names:
df.columns = [col.replace(" (cm)", "").replace(" ", "_") for col in df.columns]

Теперь используйте многострочную оценку, предоставленную pandas eval method:

df.eval("""ratio1 = sepal_length/sepal_width
           ratio2 = petal_length/petal_width""")

См. Документацию здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...