Как изменить DataFrames, чтобы они имели только строки со значениями общего индекса в Pandas? - PullRequest
1 голос
/ 26 марта 2020

Итак, я студент, изучающий данные, работающий с некоторыми данными в Python Pandas, и у меня есть два фрейма данных, индексы которых являются датами (каждый генерируется чтением файлов CSV с pandas .readcsv ("filepath") , index_col = "DATE", parse_dates = True, dayfirst = True)). Я хочу изменить эти фреймы данных таким образом, чтобы они содержали только строки, значения индекса которых являются общими для обоих. Таким образом, я могу напрямую сравнивать их для поиска корреляций в данных.

I Последние несколько часов я потратил на поиск документации и SO, чтобы найти способы сделать это, и на данный момент у меня есть следующий код:

common_dates = list(set(df1.index.values).intersection(df2.index.values))
print(common_dates)
print(normalized_house_index_data.index.values)
df1= df1.take(common_dates)
df2= df2.take(common_dates)

Однако, это дает мне индекс вне границ ошибка, даже если общие_даты должны быть созданы из элементов в массиве index.values. Когда я смотрю на вывод операторов print (), которые я добавил как часть моего устранения неполадок, я вижу следующее для common_dates:

[numpy.datetime64('2000-12-31T00:00:00.000000000'), numpy.datetime64('2001-12-31T00:00:00.000000000'), numpy.datetime64('2004-12-31T00:00:00.000000000'), numpy.datetime64('2003-12-31T00:00:00.000000000'), #and more values

И следующее для df1.index.values:

['2000-12-31T00:00:00.000000000' '2001-12-31T00:00:00.000000000'
 '2002-12-31T00:00:00.000000000' '2003-12-31T00:00:00.000000000' #and more values

Значения для df2.index.values ​​выглядят аналогично df1.

['1947-12-31T00:00:00.000000000' '1948-12-31T00:00:00.000000000'
#lots of values
 '1997-12-31T00:00:00.000000000' '1998-12-31T00:00:00.000000000'
 '1999-12-31T00:00:00.000000000' '2000-12-31T00:00:00.000000000'
 '2001-12-31T00:00:00.000000000' '2002-12-31T00:00:00.000000000'
#more values

Это выдает ошибку «индексы вне границ». Я пытался использовать list (map (str, common_dates) для преобразования common_dates в строки, поскольку похоже, что может быть какое-то несоответствие типов, но это дает «недопустимый литерал для int () с основанием 10: '2000- 12-31T00: 00: 00.000000000 '"вместо этого; я попытался аналогичным образом преобразовать их в int или numpy .datetime64, но оба они дают ошибки" index out of bounds ".

У меня есть также попробовал альтернативный подход с использованием df1.iterrows ():

droplist = []
for date, value in df1.iterrows():
    if date not in common_dates:
        droplist.append(date)
df1= df1.drop(droplist)

Я также попробовал версию этого, сравнивая дату каждой строки непосредственно со значениями df2.index.values. Оба они просто приводят ко всем строки удаляются из таблицы, а не только несоответствующие строки удаляются.

Что я делаю не так, здесь? Я просто неверный подход к этому, или я что-то упускаю

1 Ответ

1 голос
/ 26 марта 2020

Я думаю, что здесь проблема с take, у меня работает DataFrame.loc для выбора по общим показателям:

a = pd.DatetimeIndex(['2000-12-31T00:00:00.000000000',
                      '2001-12-31T00:00:00.000000000',
                      '2002-12-31T00:00:00.000000000', 
                      '2003-12-31T00:00:00.000000000'])

b = pd.DatetimeIndex(['1947-12-31T00:00:00.000000000',
                      '1948-12-31T00:00:00.000000000',
                      '1997-12-31T00:00:00.000000000',
                      '1998-12-31T00:00:00.000000000',
                      '1999-12-31T00:00:00.000000000',
                      '2000-12-31T00:00:00.000000000',
                      '2001-12-31T00:00:00.000000000',
                      '2002-12-31T00:00:00.000000000'])

df1 = pd.DataFrame(index=a)
df2 = pd.DataFrame(index=b)

common_dates = list(set(df1.index.values).intersection(df2.index.values))
print(common_dates)
[numpy.datetime64('2000-12-31T00:00:00.000000000'), 
 numpy.datetime64('2001-12-31T00:00:00.000000000'), 
 numpy.datetime64('2002-12-31T00:00:00.000000000')]

Также возможно использование Index.intersection для общих индексов:

common_dates = df1.index.intersection(df2.index)
print(common_dates)
DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31'], 
              dtype='datetime64[ns]', freq='A-DEC')

df1= df1.loc[common_dates]
df2= df2.loc[common_dates]
print (df1)
Empty DataFrame
Columns: []
Index: [2000-12-31 00:00:00, 2001-12-31 00:00:00, 2002-12-31 00:00:00]

print (df2)
Empty DataFrame
Columns: []
Index: [2000-12-31 00:00:00, 2001-12-31 00:00:00, 2002-12-31 00:00:00]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...