Фильтр строк данных на основе сравнения с другим кадром данных - PullRequest
1 голос
/ 07 октября 2019

Я хочу отфильтровать один фрейм данных по датам, попадающим между датами другого фрейма.

Я пробовал следующий код:

df1 = pd.DataFrame({
                   'Start':['1/1/2016', '1/1/2016', '1/1/2016', '1/1/2016', '1/1/2016'], 
                    'end':['1/12/2016', '1/12/2016', '1/12/2016', '1/12/2016', '1/12/2016'], 
                   'Qty':[1, 2, 3, 4, 2],
                   })

df2 = pd.DataFrame({
                    'Start':['1/1/2016', '1/1/2016', '1/1/2016'], 
                    'end':['1/6/2016', '1/6/2016', '1/6/2016'], 
                    'Price':[11, 12, 31],
                   })

df2[(df2['Start']>=df1['Start']) & (df2['end']<=df1['end'])]

Следует выбрать все триряды df2. Но выдает эту ошибку:

ValueError: Can only compare identically-labeled Series objects

PS Количество строк не может быть одинаковым в моем случае.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019
  • pandas.to_datetime() - преобразовать аргумент в дату и время.
  • DataFrame.reindex() - преобразовать DataFrame в новый индекс с необязательной логикой заполнения, поместив NA /NaN в местоположениях, не имеющих значения в предыдущем индексе.

Пример.

import pandas as pd

df1 = pd.DataFrame({
                   'Start':['1/1/2016', '1/1/2016', '1/1/2016', '1/1/2016', '1/1/2016'],
                    'end':['1/12/2016', '1/12/2016', '1/12/2016', '1/12/2016', '1/12/2016'],
                   'Qty':[1, 2, 3, 4, 2],
                   })

df2 = pd.DataFrame({
                    'Start':['1/1/2016', '1/1/2016', '1/1/2016'],
                    'end':['1/6/2016', '1/6/2016', '1/6/2016'],
                    'Price':[11, 12, 31],
                   })

# resize df2 shape
df2 = df2.reindex(df1.index)

# convert argument to datetime.
df1['Start'] = pd.to_datetime(df1['Start'])
df1['end'] = pd.to_datetime(df1['end'])

df2['Start'] = pd.to_datetime(df2['Start'])
df2['end'] = pd.to_datetime(df2['end'])

print(df2[(df2['Start'] >= df1['Start']) & (df2['end'] <= df1['end'])])

       Start        end  Price
0 2016-01-01 2016-01-06   11.0
1 2016-01-01 2016-01-06   12.0
2 2016-01-01 2016-01-06   31.0
0 голосов
/ 07 октября 2019

У вас должно быть одинаковое количество строк в обоих фреймах данных для сравнения. Здесь у вас есть 5 строк в df1 и 3 строки в df2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...