Поиск по блогу

суббота, 18 апреля 2015 г.

Учимся фильтровать строки DataFrame (pandas) .str.contains()

Чтобы научиться фильтровать строки по условиям вида [pd1[column1] > 100], [pd1['col2'].isin(model_list)], [pd1['Datem'].str.contains('^3.+')], pd1.dropna(subset = ['n1_y', 'Brandt', 'Model'])[10:15] нужно знать форматы столбцов и помнить, что .str.contains() выдает ошибку, если в столбце есть пропущенные значения (NaN) Здесь я сначал хотел попрактиковать регулярные врважения, но оказалось, что подводные камни .str.contains заняли почти весь пост...

In [2]:
import os
import pandas as pd
import numpy as np
from cStringIO import StringIO
In [3]:
DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/'
filterfilenames = 'eng_car-sales-in'
# При считывании каждого файла во фрейм нужно будет добавлять столбец дат, 
# для этого мы используем список и словарь:
months = ['january', 'february', 'march', 'april', 'may', 'june',
        'july', 'august','september', 'october','november', 'december']
    
dict = {'january':'31-1', 'february':'28-2', 'march':'31-3',
        'april':'30-4', 'may':'31-5', 'june':'30-6',
        'july':'31-7', 'august':'31-8','september':'30-9', 
        'october':'31-10','november':'30-11', 'december':'31-12'}
In [4]:
# month first
colnames_3_0_11_april =['n1_y', 'Model', 'Brandt', \
                  '2014y3', '2013y3', 'u1413y3', '1413y3', \
                  '2014m3', '2013m3', 'u1413m3', '1413m3', 'Datem']
In [5]:
def addDatem(csvfile):
    # Parse month name from filename
    namen = csvfile.split('-')[3]            # 'april' for example
    
    # Replace strings with dict     'april':'30-4', 
    datstr = dict[namen] + '-2014'  # '30-4-2014'    
    return datstr
In [6]:
csvfile = 'eng_car-sales-in-april-2014.csv'
addDatem(csvfile)
Out[6]:
'30-4-2014'
In [7]:
csvfile_path = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/eng_car-sales-in-april-2014.csv'
pd_april = pd.read_csv(csvfile_path, error_bad_lines=False, \
                     na_values=['-','n/a'], names=colnames_3_0_11_april, \
                     quotechar='"', sep=',', thousands=',')
In [8]:
pd_april['Datem'] = addDatem(csvfile) 
In [9]:
pd_april.head(3)
Out[9]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
In [11]:
pd_april.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 25 entries, 0 to 24
Data columns (total 12 columns):
n1_y       25 non-null int64
Model      25 non-null object
Brandt     25 non-null object
2014y3     25 non-null int64
2013y3     25 non-null int64
u1413y3    24 non-null object
1413y3     24 non-null object
2014m3     25 non-null int64
2013m3     25 non-null int64
u1413m3    24 non-null object
1413m3     24 non-null object
Datem      25 non-null object
dtypes: int64(5), object(7)
memory usage: 1.9+ KB

Как отобрать строки по численным значениям в столбце? Очень просто.

In [10]:
pd_april[pd_april['2014y3']>25000]
Out[10]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014
4 5 Kalina Lada 25864 28395 (2,531) -9% 7731 8857 (1,126) -13% 30-4-2014
In [12]:
pd_april[(pd_april['2014y3']>25000)&(pd_april['2014y3']<35000)]
Out[12]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014
4 5 Kalina Lada 25864 28395 (2,531) -9% 7731 8857 (1,126) -13% 30-4-2014

Есть список значений. Выберем из фрейма по этому списку (строк или чисел)

In [13]:
model_list = ['Solaris', 'Duster']
In [14]:
pd_april[pd_april['Model'].isin(model_list)]
Out[14]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014
In [15]:
pd_april[pd_april['2014y3'].isin([29971, 28153])]
Out[15]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014

Теперь объединим оба условия, во втором случае ипользуем волшебный знак ~ ВНИМАНИЕ!!! Зто отрицание, которое меняет условие на противоположное.

In [16]:
pd_april[(pd_april['2014y3'].isin([29971, 28153]))&(pd_april['Model'].isin(model_list))]
Out[16]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014
In [ ]:
Следующая строчка отличается от предыдущей только знаком **~**во втором условии.
In [17]:
pd_april[(pd_april['2014y3'].isin([29971, 28153]))&(~pd_april['Model'].isin(model_list))]
Out[17]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014

.str.contains() - это еще та штучка

isin() is ideal if you have a list of exact matches, but if you have a list of partial matches or substrings to look for, you can filter using the str.contains method and regular expressions.

Сначала попробуем простейший вариант с поиком по маске. Он отлично работает. В настройках можно поменять умолчания (нас волнцет в первую очередь чуствительность к регистру), вот строка из документации:

In [ ]:
 StringMethods.contains(pat, case=True, flags=0, na=nan, regex=True)
In [21]:
pd_april[pd_april['Brandt'].str.contains(r'KIA')]
Out[21]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
20 21 Sportage KIA 9979 10358 (379) -4% 2526 2857 (331) -12% 30-4-2014
In [22]:
pd_april[pd_april['Brandt'].str.contains(r'KI')]
Out[22]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
20 21 Sportage KIA 9979 10358 (379) -4% 2526 2857 (331) -12% 30-4-2014
In [23]:
pd_april[pd_april['Brandt'].str.contains(r'k')]
Out[23]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
12 13 Octavia A7 Škoda 13171 0 NaN NaN 3753 0 NaN NaN 30-4-2014

В скобках .contains должна быть строка - first argument must be string or compiled pattern, поэтому попытка применить этот метод к числовому столбцу вызывает ошибку

In [ ]:
pd_april[pd_april['2014y3'].str.contains('99')]
# Метод будет искать строку в числах, что вызовет ошибку:
# KeyError: '[ nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan  nan\n  
# nan  nan  nan  nan  nan  nan  nan  nan  nan  nan] 
#  not in index'

Тогда, попробуем найти подстроку '99' в столбце строк 'u1413m3' ...и снова получим ошибку... и только из-за того, что столбце есть пропуски NaN !!! Это всерьез подрывает мою веру в человечество:

In [ ]:
pd_april[pd_april['u1413m3'].str.contains('99')]
# ValueError: cannot index with vector containing NA / NaN values
In [ ]:
Но последний столбец я сам заполнял датами (строками), там пропусков нет ...проверим на нем... Все работает:
In [33]:
pd_april[pd_april['Datem'].str.contains(r'20')][:2]
Out[33]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014

Итак, мы нашли здоровенный подводный камень: ПРОПУСКИ данных не обрабатываются в методе .contains()

Запомним, что важно соблюдвать (как минимум) два неочевидных условия: обрабатывается только текстовый столбец, и без пропусков данных NaN

.str.contains и регулярные выражения

Здесь мой справочник Regular Expressions Python ... и мой перечень главных команд , так что сначала проверим синтаксис .str.contains(), а потом поэкспериментируем с выражениями regexp

In [35]:
pd_april[pd_april['Datem'].str.contains('^3.+')][:2]
Out[35]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014
In [40]:
pd_april[pd_april['u1413m3']== 'NaN'] #[:2]
Out[40]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem

Вот вариант отобрать строки, в которых нет пропусков данных NaN

In [41]:
pd_april[pd_april['u1413m3'] != 'NaN'][:2]
Out[41]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014

А теперь попробуем к этому новому набору применить .str.contains, скопипастим еще одно условие из работающего примера выше и добавим, ...работает:

In [42]:
pd_april[pd_april['u1413m3'] != 'NaN'][pd_april['Datem'].str.contains('^3.+')][:2]
Out[42]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014

А теперь попробуем неработавшиий ранее (из-за пропусков) пример и снова получим ту же ошибку:

In [ ]:
pd_april[pd_april['u1413m3'] != 'NaN'][pd_april['u1413m3'].str.contains('99')]
#ValueError: cannot index with vector containing NA / NaN values
In [60]:
pdn= pd_april[pd_april['u1413m3'] == 'NaN']
In [61]:
pdn
Out[61]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem

Не могу отфильтровать пропуски ни одним из методов, оказывается для них есть специальные методы

Это нейтронная бомба, которая убивает все строки с Nan в любых столбцах, в примере внизу нет строки 12

In [70]:
pd_april.dropna()[10:15]
Out[70]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
10 11 Logan Renault 14342 16674 (2,332) -14% 3796 4890 (1,094) -22% 30-4-2014
11 12 Sandero Renault 13777 14464 (687) -5% 3796 4084 (288) -7% 30-4-2014
13 14 4x4 Lada 12931 14599 (1,668) -11% 3784 3808 (24) -1% 30-4-2014
14 15 RAV 4 Toyota 12501 11410 1,091 10% 4391 4974 (583) -12% 30-4-2014
15 16 Cruze Chevrolet 12363 14565 (2,202) -15% 3014 4284 (1,270) -30% 30-4-2014

А вот более точный вариант для конкретного подмножества столбцов, здесь мы берем столбцы без пропусков, и 12 строка появляется.

In [71]:
pd_april.dropna(subset = ['n1_y', 'Brandt', 'Model'])[10:15]
Out[71]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
10 11 Logan Renault 14342 16674 (2,332) -14% 3796 4890 (1,094) -22% 30-4-2014
11 12 Sandero Renault 13777 14464 (687) -5% 3796 4084 (288) -7% 30-4-2014
12 13 Octavia A7 Škoda 13171 0 NaN NaN 3753 0 NaN NaN 30-4-2014
13 14 4x4 Lada 12931 14599 (1,668) -11% 3784 3808 (24) -1% 30-4-2014
14 15 RAV 4 Toyota 12501 11410 1,091 10% 4391 4974 (583) -12% 30-4-2014
In [ ]:
 DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
In [ ]:
axis : {0, 1}, or tuple/list thereof

    Pass tuple or list to drop on multiple axes

how : {any, all}

        any : if any NA values are present, drop that label
        all : if all values are NA, drop that label

thresh : int, default None

    int value : require that many non-NA values

subset : array-like

    Labels along other axis to consider, e.g. if you are dropping rows these would be a list of columns to include

inplace : boolean, defalt False

    If True, do operation inplace and return None.

Returns: 

dropped : DataFrame

Еще раз обращаю внимание на этот пост, здесь все варианты ответов How to drop rows of Pandas dataframe whose value of certain column is NaN

In [ ]:
In [24]: df = pd.DataFrame(np.random.randn(10,3))

In [25]: df.ix[::2,0] = np.nan; df.ix[::4,1] = np.nan; df.ix[::3,2] = np.nan;

In [26]: df
Out[26]:
          0         1         2
0       NaN       NaN       NaN
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [27]: df.dropna()     #drop all rows that have any NaN values
Out[27]:
          0         1         2
1  2.677677 -1.466923 -0.750366
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295

In [28]: df.dropna(how='all')     #drop only if ALL columns are NaN
Out[28]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
4       NaN       NaN  0.050742
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
8       NaN       NaN  0.637482
9 -0.310130  0.078891       NaN

In [29]: df.dropna(thresh=2)   #Drop row if it does not have at least two values that are **not** NaN
Out[29]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

In [30]: df.dropna(subset=[1])   #Drop only if NaN in specific column (as asked in the question)
Out[30]:
          0         1         2
1  2.677677 -1.466923 -0.750366
2       NaN  0.798002 -0.906038
3  0.672201  0.964789       NaN
5 -1.250970  0.030561 -2.678622
6       NaN  1.036043       NaN
7  0.049896 -0.308003  0.823295
9 -0.310130  0.078891       NaN

И вот этот вариант тоже рабочий

In [ ]:
df = df[pd.notnull(df['EPS'])] # Изящное решение
df.dropna(subset=['EPS']) # А это основной

А вот этот наворот с numpy у меня не работает.

In [74]:
pd_april[np.isfinite(pd_april['1413m3'])][10:15]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-74-d3c7e93c1c82> in <module>()
----> 1 pd_april[np.isfinite(pd_april['1413m3'])][10:15]

TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Теперь мы можем решить задачку, когда в столбце есть Nan

Сначала мы убираем строки, в которых есть Nan в столбце 'u1413m3', создаем новый объект DataFrame, а с ним уже работает метод str.contains()

In [82]:
ppd = pd_april.dropna(subset=['u1413m3',]) #.str.contains('99')
In [85]:
ppd[ppd['u1413m3'].str.contains('99')]
Out[85]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
17 18 Focus Ford 10923 22278 (11,355) -51% 2549 5546 (2,997) -54% 30-4-2014

Казалось бы, решение найдено..., но чтоя буду делать с этип общипанным новым объектом? Можно ли не создавать дополнитеьный объект?

Оказывается, что нельзя. Начинается переиндексация, а потом, когда выясняется, что старый индекс поломан после того, как убрали строку с Nan, то встает вопрос, какой индекс использовать:

In [87]:
pd_april[pd_april.dropna(subset=['u1413m3',])['u1413m3'].str.contains('99')]
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py:1808: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  "DataFrame index.", UserWarning)
---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
<ipython-input-87-81f3bc394aeb> in <module>()
----> 1 pd_april[pd_april.dropna(subset=['u1413m3',])['u1413m3'].str.contains('99')]

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in __getitem__(self, key)
   1772         if isinstance(key, (Series, np.ndarray, Index, list)):
   1773             # either boolean or fancy integer index
-> 1774             return self._getitem_array(key)
   1775         elif isinstance(key, DataFrame):
   1776             return self._getitem_frame(key)

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in _getitem_array(self, key)
   1812             # _check_bool_indexer will throw exception if Series key cannot
   1813             # be reindexed to match DataFrame rows
-> 1814             key = _check_bool_indexer(self.index, key)
   1815             indexer = key.nonzero()[0]
   1816             return self.take(indexer, axis=0, convert=False)

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.pyc in _check_bool_indexer(ax, key)
   1637         mask = com.isnull(result.values)
   1638         if mask.any():
-> 1639             raise IndexingError('Unalignable boolean Series key provided')
   1640 
   1641         result = result.astype(bool).values

IndexingError: Unalignable boolean Series key provided
In [ ]:
####Приложение 1. 
In [29]:
pd_april
Out[29]:
n1_y Model Brandt 2014y3 2013y3 u1413y3 1413y3 2014m3 2013m3 u1413m3 1413m3 Datem
0 1 Granta Lada 45570 52765 (7,195) -14% 13077 15596 (2,519) -16% 30-4-2014
1 2 Solaris Hyundai 35218 35941 (723) -2% 9774 10553 (779) -7% 30-4-2014
2 3 New Rio KIA 29971 28211 1,760 6% 9045 8430 615 7% 30-4-2014
3 4 Duster Renault 28153 25945 2,208 9% 7606 7600 6 0% 30-4-2014
4 5 Kalina Lada 25864 28395 (2,531) -9% 7731 8857 (1,126) -13% 30-4-2014
5 6 Polo VW 21366 21798 (432) -2% 5964 6637 (673) -10% 30-4-2014
6 7 Largus Lada 20491 14379 6,112 43% 5889 4209 1,680 40% 30-4-2014
7 8 Priora Lada 18173 21495 (3,322) -15% 5212 4962 250 5% 30-4-2014
8 9 Almera Nissan 16950 596 16,354 2744% 5798 483 5,315 1100% 30-4-2014
9 10 Niva Chevrolet 15534 17748 (2,214) -12% 4983 5724 (741) -13% 30-4-2014
10 11 Logan Renault 14342 16674 (2,332) -14% 3796 4890 (1,094) -22% 30-4-2014
11 12 Sandero Renault 13777 14464 (687) -5% 3796 4084 (288) -7% 30-4-2014
12 13 Octavia A7 Škoda 13171 0 NaN NaN 3753 0 NaN NaN 30-4-2014
13 14 4x4 Lada 12931 14599 (1,668) -11% 3784 3808 (24) -1% 30-4-2014
14 15 RAV 4 Toyota 12501 11410 1,091 10% 4391 4974 (583) -12% 30-4-2014
15 16 Cruze Chevrolet 12363 14565 (2,202) -15% 3014 4284 (1,270) -30% 30-4-2014
16 17 ix35 Hyundai 11738 9658 2,080 22% 3119 2030 1,089 54% 30-4-2014
17 18 Focus Ford 10923 22278 (11,355) -51% 2549 5546 (2,997) -54% 30-4-2014
18 19 Corolla Toyota 10461 7714 2,747 36% 2450 2418 32 1% 30-4-2014
19 20 Camry Toyota 10338 10074 264 3% 2987 2822 165 6% 30-4-2014
20 21 Sportage KIA 9979 10358 (379) -4% 2526 2857 (331) -12% 30-4-2014
21 22 Astra Opel 9901 12080 (2,179) -18% 2049 3221 (1,172) -36% 30-4-2014
22 23 Juke Nissan 9589 7750 1,839 24% 2837 1657 1,180 71% 30-4-2014
23 24 Outlander Mitsubishi 9447 8015 1,432 18% 1526 2447 (921) -38% 30-4-2014
24 25 X-Trail Nissan 9177 8767 410 5% 1436 1614 (178) -11% 30-4-2014

Приложение. Есть альтернативный вариант, но он у меня не работает, разбираться не вижу смысла...

pandas.DataFrame.query - те же возможности, что и выше, а синтаксис другой... ну и зачем на это время тратить...

In [19]:
pd_april.query('2014y3 in (29971, 28153)')
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-19-1e80118c292b> in <module>()
----> 1 pd_april.query('2014y3 in (29971, 28153)')

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in query(self, expr, **kwargs)
   1916         """
   1917         kwargs['level'] = kwargs.pop('level', 0) + 1
-> 1918         res = self.eval(expr, **kwargs)
   1919 
   1920         try:

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in eval(self, expr, **kwargs)
   1968         kwargs['target'] = self
   1969         kwargs['resolvers'] = kwargs.get('resolvers', ()) + resolvers
-> 1970         return _eval(expr, **kwargs)
   1971 
   1972     def select_dtypes(self, include=None, exclude=None):

/usr/local/lib/python2.7/dist-packages/pandas/computation/eval.pyc in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target)
    216     """
    217     expr = _convert_expression(expr)
--> 218     _check_engine(engine)
    219     _check_parser(parser)
    220     _check_resolvers(resolvers)

/usr/local/lib/python2.7/dist-packages/pandas/computation/eval.pyc in _check_engine(engine)
     38             import numexpr
     39         except ImportError:
---> 40             raise ImportError("'numexpr' not found. Cannot use "
     41                               "engine='numexpr' for query/eval "
     42                               "if 'numexpr' is not installed")

ImportError: 'numexpr' not found. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed
In [18]:
pd_april.query('25000 < 2014y3 < 35000')
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-18-6b7a98553d26> in <module>()
----> 1 pd_april.query('25000 < 2014y3 < 35000')

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in query(self, expr, **kwargs)
   1916         """
   1917         kwargs['level'] = kwargs.pop('level', 0) + 1
-> 1918         res = self.eval(expr, **kwargs)
   1919 
   1920         try:

/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in eval(self, expr, **kwargs)
   1968         kwargs['target'] = self
   1969         kwargs['resolvers'] = kwargs.get('resolvers', ()) + resolvers
-> 1970         return _eval(expr, **kwargs)
   1971 
   1972     def select_dtypes(self, include=None, exclude=None):

/usr/local/lib/python2.7/dist-packages/pandas/computation/eval.pyc in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target)
    216     """
    217     expr = _convert_expression(expr)
--> 218     _check_engine(engine)
    219     _check_parser(parser)
    220     _check_resolvers(resolvers)

/usr/local/lib/python2.7/dist-packages/pandas/computation/eval.pyc in _check_engine(engine)
     38             import numexpr
     39         except ImportError:
---> 40             raise ImportError("'numexpr' not found. Cannot use "
     41                               "engine='numexpr' for query/eval "
     42                               "if 'numexpr' is not installed")

ImportError: 'numexpr' not found. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed


Посты чуть ниже также могут вас заинтересовать

3 комментария:

  1. Челоек, написваший эту статью - храни тебя всё, что можно и нельзя)

    ОтветитьУдалить
  2. Верно, Вы здорово помогли
    Статья очень ясная, спасибо!

    ОтветитьУдалить