Подмножество 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))
спасибо.
Ответы
Ответ 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']]