2017-01-30 7 views
1

Я попытался подмножить набор данных, используя два критерия столбца, но мой результат вызывает ошибку. Любая идея (ы) почему? Это мой код:Python - подмножество набора данных с использованием двух критериев столбца

df[(df['locations'] = 'New York City Metro Area') & (2016-09-01 < df['publication_date'] < 2016-09-30)] 

Это моя ошибка:

f = lambda x, y: lib.ismember(x, set(values)) 
    File "pandas\lib.pyx", line 158, in pandas.lib.ismember (pandas\lib.c:5199) 
TypeError: unhashable type: 'list' 

Если это помогает, мои данные выглядит примерно так:

df['publication_date'].head() 

0 2017-01-30T04:48:11.929095Z 
1   2016-11-15T05:30:03Z 
2 2017-01-30T04:45:24.861067Z 
3 2017-01-30T04:47:41.419255Z 
4 2017-01-30T04:49:36.192148Z 
Name: publication_date, dtype: object 

df['locations'].head() 

0  [{'name': 'Kansas City, MO'}] 
1   [{'name': 'Evanston, IL'}] 
2   [{'name': 'Stamford, CT'}] 
3    [{'name': 'Reno, NV'}] 
4 [{'name': 'Boston Metro Area'}] 
Name: locations, dtype: object 

ответ

2

Я думаю, что вы можете извлечь keyname из каждая dict сначала, а затем конвертировать stringto_datetime. Последнее использование boolean indexing с between:

df = pd.DataFrame({'locations':[[{'name': 'Kansas City, MO'}], [{'name': 'Evanston, IL'}], [{'name': 'Stamford, CT'}],[{'name': 'Reno, NV'}],[{'name': 'Boston Metro Area'}]], 
        'publication_date':['2017-01-30T04:48:11.929095Z','2016-11-15T05:30:03Z','2017-01-30T04:45:24.861067Z','2017-01-30T04:47:41.419255Z','2017-01-30T04:49:36.192148Z']}) 
print (df) 
         locations    publication_date 
0 [{'name': 'Kansas City, MO'}] 2017-01-30T04:48:11.929095Z 
1  [{'name': 'Evanston, IL'}]   2016-11-15T05:30:03Z 
2  [{'name': 'Stamford, CT'}] 2017-01-30T04:45:24.861067Z 
3   [{'name': 'Reno, NV'}] 2017-01-30T04:47:41.419255Z 
4 [{'name': 'Boston Metro Area'}] 2017-01-30T04:49:36.192148Z 

print (type(df.locations.iloc[0])) 
<class 'list'> 


df.locations = df.locations.apply(lambda x: x[0]['name']) 
df.publication_date = pd.to_datetime(df.publication_date) 
print (df) 
      locations   publication_date 
0 Kansas City, MO 2017-01-30 04:48:11.929095 
1  Evanston, IL 2016-11-15 05:30:03.000000 
2  Stamford, CT 2017-01-30 04:45:24.861067 
3   Reno, NV 2017-01-30 04:47:41.419255 
4 Boston Metro Area 2017-01-30 04:49:36.192148 

print (df[(df['locations'] == 'Boston Metro Area') & 
      (df['publication_date'].between('2016-09-01', '2018-09-30'))]) 
      locations   publication_date 
4 Boston Metro Area 2017-01-30 04:49:36.192148 

Решение с query:

print (df.query('locations == "Boston Metro Area" and "2016-09-01" < publication_date < "2018-09-30"')) 
      locations   publication_date 
4 Boston Metro Area 2017-01-30 04:49:36.192148 

В случае необходимости Dont изменить структуру значений в столбце locations:

df.publication_date = pd.to_datetime(df.publication_date) 
print (df) 
         locations   publication_date 
0 [{'name': 'Kansas City, MO'}] 2017-01-30 04:48:11.929095 
1  [{'name': 'Evanston, IL'}] 2016-11-15 05:30:03.000000 
2  [{'name': 'Stamford, CT'}] 2017-01-30 04:45:24.861067 
3   [{'name': 'Reno, NV'}] 2017-01-30 04:47:41.419255 
4 [{'name': 'Boston Metro Area'}] 2017-01-30 04:49:36.192148 

print (df[(df['locations'].apply(lambda x: x[0]['name']) == 'Boston Metro Area') & 
      (df['publication_date'].between('2016-09-01', '2018-09-30'))]) 

         locations   publication_date 
4 [{'name': 'Boston Metro Area'}] 2017-01-30 04:49:36.192148 
+1

Как я могу найти вне nt данных принадлежит этому подмножеству? – user2105555

+1

Если 'df1 = df.query ('местоположения ==" Площадь Бостона Метро "и" 2016-09-01 " jezrael

+1

Я не уверен, но, похоже, опечатка' df.to_datetime' - нужна 'pd.to_datetime'. – jezrael

 Смежные вопросы

  • Нет связанных вопросов^_^