534

私はPythonパンダDataFrameを持っていますrpt

rpt
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 47518 entries, ('000002', '20120331') to ('603366', '20091231')
Data columns:
STK_ID                    47518  non-null values
STK_Name                  47518  non-null values
RPT_Date                  47518  non-null values
sales                     47518  non-null values

ストックIDが次'600809'のような行をフィルタリングできます。rpt[rpt['STK_ID'] == '600809']

<class 'pandas.core.frame.DataFrame'>
MultiIndex: 25 entries, ('600809', '20120331') to ('600809', '20060331')
Data columns:
STK_ID                    25  non-null values
STK_Name                  25  non-null values
RPT_Date                  25  non-null values
sales                     25  non-null values

そして、など、いくつかの株のすべての行をまとめたいと思います['600809','600141','600329']。つまり、次のような構文が必要です。

stk_list = ['600809','600141','600329']

rst = rpt[rpt['STK_ID'] in stk_list] # this does not works in pandas 

パンダは上記のコマンドを受け入れないので、どのように目標を達成するのですか?

4

7 に答える 7

774

isin次の方法を使用します。

rpt[rpt['STK_ID'].isin(stk_list)]

于 2012-08-22T03:21:12.067 に答える
125

isin()完全一致のリストがある場合は理想的ですが、部分一致または検索する部分文字列のリストがある場合は、str.containsメソッドと正規表現を使用してフィルタリングできます。

'600'たとえば、最初に3桁の数字が続くすべてのストックIDがあるDataFrameを返したい場合は次のようになります。

>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
...   STK_ID   ...                                    # [0-9]{3} means any three digits
...  '600809'  ...                                    # $ means end of string
...  '600141'  ...
...  '600329'  ...
...      ...   ...

ここで、値の'STK_ID'末尾を指定する文字列のリストがあるとします。たとえば、

endstrings = ['01$', '02$', '05$']

これらの文字列を正規表現の'または'文字で結合し、|その文字列をに渡しstr.containsてDataFrameをフィルタリングできます。

>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
...   STK_ID   ...
...  '155905'  ...
...  '633101'  ...
...  '210302'  ...
...      ...   ...

最後に、大文字とcontains小文字を無視して(を設定することによりcase=False)、照合する文字列を指定するときに、より一般的にすることができます。

例えば、

str.contains('pandas', case=False)

PANDAS、、、などPanDAsに一致paNdAs123します。

于 2014-11-03T22:49:27.230 に答える
46

次を使用して範囲を使用することもできます。

b = df[(df['a'] > 1) & (df['a'] < 5)]
于 2013-10-10T12:26:29.810 に答える
45

この情報について、DataFrameに直接クエリすることもできます。

rpt.query('STK_ID in (600809,600141,600329)')

または、同様に範囲を検索します。

rpt.query('60000 < STK_ID < 70000')
于 2015-03-17T20:12:10.800 に答える
32

パンダでデータをスライスする

このようなデータフレームが与えられた場合:

    RPT_Date  STK_ID STK_Name  sales
0 1980-01-01       0   Arthur      0
1 1980-01-02       1    Beate      4
2 1980-01-03       2    Cecil      2
3 1980-01-04       3     Dana      8
4 1980-01-05       4     Eric      4
5 1980-01-06       5    Fidel      5
6 1980-01-07       6   George      4
7 1980-01-08       7     Hans      7
8 1980-01-09       8   Ingrid      7
9 1980-01-10       9    Jones      4

データを選択またはスライスする方法は複数あります。

.isinの使用

最も明白なのは.isin機能です。次のようなデータフレームに適用できる一連のTrue/ステートメントを提供するマスクを作成できます。False

mask = df['STK_ID'].isin([4, 2, 6])

mask
0    False
1    False
2     True
3    False
4     True
5    False
6     True
7    False
8    False
9    False
Name: STK_ID, dtype: bool

df[mask]
    RPT_Date  STK_ID STK_Name  sales
2 1980-01-03       2    Cecil      2
4 1980-01-05       4     Eric      4
6 1980-01-07       6   George      4

マスキングは問題のアドホックな解決策ですが、速度とメモリの点で常にうまく機能するとは限りません。

インデックス付き

インデックスをSTK_ID列に設定することで、パンダの組み込みスライスオブジェクトを使用できます.loc

df.set_index('STK_ID', inplace=True)
         RPT_Date STK_Name  sales
STK_ID                           
0      1980-01-01   Arthur      0
1      1980-01-02    Beate      4
2      1980-01-03    Cecil      2
3      1980-01-04     Dana      8
4      1980-01-05     Eric      4
5      1980-01-06    Fidel      5
6      1980-01-07   George      4
7      1980-01-08     Hans      7
8      1980-01-09   Ingrid      7
9      1980-01-10    Jones      4

df.loc[[4, 2, 6]]
         RPT_Date STK_Name  sales
STK_ID                           
4      1980-01-05     Eric      4
2      1980-01-03    Cecil      2
6      1980-01-07   George      4

これは高速な方法です。インデックス作成に少し時間がかかる場合でも、このような複数のクエリを実行する場合は時間を節約できます。

データフレームのマージ

これは、データフレームをマージすることによっても実行できます。これは、これらの例よりも多くのデータがあるシナリオに適しています。

stkid_df = pd.DataFrame({"STK_ID": [4,2,6]})
df.merge(stkid_df, on='STK_ID')
   STK_ID   RPT_Date STK_Name  sales
0       2 1980-01-03    Cecil      2
1       4 1980-01-05     Eric      4
2       6 1980-01-07   George      4

ノート

上記のすべてのメソッドは、同じ行が複数ある場合でも機能します'STK_ID'

于 2017-04-27T13:24:17.697 に答える
14

'query'と@を使用して同様の結果を達成することもできます。

例えば:

df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
list_of_values = [3,6]
result= df.query("A in @list_of_values")
result
   A  B
1  6  2
2  3  3
于 2017-09-28T03:04:39.613 に答える
7

次のように使用できますquery

b = df.query('a > 1 & a < 5')
于 2017-04-26T20:09:12.843 に答える