web-dev-qa-db-ja.com

Python DataFrameのサブセット化

RからPythonに移行しています。パンダを使い始めたばかりです。私はうまくサブセットする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..

私はこれを間違った方法でやっていると感じ始めています。おそらく、エレガントなソリューションがあります。誰でも助けることができますか?タイムスタンプから月と年を抽出し、サブセット化する必要があります。おそらく、これらすべてを実現するワンライナーがあります。

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

ありがとう。

53
user1717931

TimeProductDataFrameの列であり、dfDataFrameのインスタンスであり、他の変数はスカラー値であると仮定します。

今のところ、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')
88
Phillip Cloud

Rに似たソリューションを探している人のためだけに:

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

data.locqueryは必要ありませんが、少し長いと思います。

20
sernle

特定の列を[]でラップすることで、任意のサブセット条件を使用できることがわかりました。たとえば、列['Product'、 'Time'、 'Year'、 'C​​olor']を持つdfがあります

そして、2014年以前に作られた製品を含めたいとしましょう。

df[df['Year'] < 2014]

これに該当するすべての行を返すため。さまざまな条件を追加できます。

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

次に、上記の指示に従って必要な列を選択します。たとえば、上記のdfの製品の色とキー、

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