Подтвердить что ты не робот

Подмножество Python DataFrame

Я перехожу из R в Python. Я только начал использовать Pandas. У меня есть R-код, который прекрасно подмножественно:

k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product))

Теперь, я хочу делать подобные вещи в Python. это то, что я получил до сих пор:

import pandas as pd
data = pd.read_csv("../data/monthly_prod_sales.csv")


#first, index the dataset by Product. And, get all that matches a given 'p.id' and time.
 data.set_index('Product')
 k = data.ix[[p.id, 'Time']]

# then, index this subset with Time and do more subsetting..

Я начинаю чувствовать, что я делаю это неправильно. возможно, есть изящное решение. Может ли кто-нибудь помочь? Мне нужно извлечь месяц и год из timestamp, который у меня есть, и сделать подмножество. Возможно, есть один-лайнер, который выполнит все это:

k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product))

спасибо.

4b9b3361

Ответ 1

Я предполагаю, что Time и Product являются столбцами в DataFrame, df является экземпляром DataFrame и что другие переменные являются скалярными значениями:

Теперь вам нужно будет ссылаться на экземпляр DataFrame:

k1 = df.loc[(df.Product == p_id) & (df.Time >= start_time) & (df.Time < end_time), ['Time', 'Product']]

Скобки также необходимы из-за приоритета оператора & и операторов сравнения. Оператор & на самом деле является перегруженным побитовым оператором, который имеет тот же приоритет, что и арифметические операторы, которые, в свою очередь, имеют более высокий приоритет, чем операторы сравнения.

В pandas 0,13 будет доступен новый экспериментальный метод DataFrame.query(). Он очень похож на подмножество по модулю аргумента select:

С query() вы сделаете так:

df[['Time', 'Product']].query('Product == p_id and Month < mn and Year == yr')

Вот простой пример:

In [9]: df = DataFrame({'gender': np.random.choice(['m', 'f'], size=10), 'price': poisson(100, size=10)})

In [10]: df
Out[10]:
  gender  price
0      m     89
1      f    123
2      f    100
3      m    104
4      m     98
5      m    103
6      f    100
7      f    109
8      f     95
9      m     87

In [11]: df.query('gender == "m" and price < 100')
Out[11]:
  gender  price
0      m     89
4      m     98
9      m     87

Окончательный запрос, который вам интересен, даже сможет использовать скоординированные сравнения, например:

k1 = df[['Time', 'Product']].query('Product == p_id and start_time <= Time < end_time')

Ответ 2

Просто для тех, кто ищет решение, более похожее на R:

df[(df.Product == p_id) & (df.Time> start_time) & (df.Time < end_time)][['Time','Product']]

Нет необходимости в data.loc или query, но я думаю, что это немного длиннее.

Ответ 3

Я обнаружил, что вы можете использовать любое условие подмножества для данного столбца, обернув его в []. Например, у вас есть df с столбцами ['Product', 'Time', 'Year', 'Color']

И позвольте сказать, что вы хотите включить продукты, сделанные до 2014 года. Вы можете написать

df[df['Year'] < 2014]

Чтобы вернуть все строки, где это так. Вы можете добавить разные условия.

df[df['Year'] < 2014][df['Color' == 'Red']

Затем просто выберите нужные столбцы, как указано выше. Например, цвет продукта и ключ для df выше,

df[df['Year'] < 2014][df['Color' == 'Red'][['Product','Color']]

Ответ 4

Создание пустого фрейма с известным именем столбца:

Names = ['Col1','ActivityID','TransactionID']
df = pd.DataFrame(columns = Names)

Создание кадра данных из csv:

df = pd.DataFrame('...../file_name.csv')

Создание динамического фильтра для подмножества dtaframe:

i = 12
df[df['ActivitiID'] <= i]

Создание динамического фильтра для подмножества необходимых столбцов dtaframe

df[df['ActivityID'] == i][['TransactionID','ActivityID']]