2016-05-19 5 views
1

я данные в .csv файл под названием 'Max.csv':Python: Пересечение двух 2D массивов

Valid Date MAX 
1/1/1995 51 
1/2/1995 45 
1/3/1995 48 
1/4/1995 45 

другой файл CSV называется 'Min.csv' выглядит как:

Valid Date MIN 
1/2/1995 33 
1/4/1995 31 
1/5/1995 30 
1/6/1995 39 

Я хочу два генерируют два словаря или любую другую предложенную структуру данных, так что я могу иметь две отдельные переменные Max и Min в питоне соответственно:

Valid Date MAX 
1/2/1995 45 
1/4/1995 45 

Valid Date MIN 
1/2/1995 33 
1/4/1995 31 

т. Е. Выберите элементы из Max и Min, чтобы выводились только общие элементы.

Я думаю об использовании numpy.intersect1d, но это означает, что я должен отдельно сравнить столбцы Max и Min first on date, найти индекс общих дат и затем захватить второй столбцы для Max и Min. Это кажется слишком сложным, и я считаю, что есть более умные способы пересечения двух кривых Max и Min.

ответ

2

Вы упомянули, что:

Я должен отдельно сравнить Макс и Мин первый на дату колонке, найти индекс общего даты, а затем захватить второй столбцы для Макс. и Мин. Это кажется слишком сложным ...

Действительно, это принципиально то, что вам нужно делать, так или иначе; но с использованием numpy_indexed пакета (отказ от ответственности: Я ее автор), это не сложно в малейшем:

import numpy_indexed as npi 
common_dates = npi.intersection(min_dates, max_dates) 
print(max_values[npi.indices(max_dates, common_dates)]) 
print(min_values[npi.indices(min_dates, common_dates)]) 

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

Примечание2: предполагается, что столбцы даты уникальны; если нет, вы должны заменить «npi.indices» на «npi.in_»

1

set() встроенный должен быть достаточно следующим образом:

>>> max = {"1/1/1995":"51", "1/2/1995":"45", "1/3/1995":"48", "1/4/1995":"45"} 
>>> min = {"1/2/1995":"33", "1/4/1995":"31", "1/5/1995":"30", "1/6/1995":"39"} 

>>> a = set(max) 
>>> b = set(min) 
>>> {x:max[x] for x in a.intersection(b)} 
{'1/4/1995': '45', '1/2/1995': '45'} 
>>> {x:min[x] for x in a.intersection(b)} 
{'1/2/1995': '33', '1/4/1995': '31'} 
+0

Можете ли вы дать нам подсказку о том, как создать набор из файла csv? Я использую pandas для чтения csv-файла в dataframe. – Zanam

+0

Это может помочь вам http://chrisalbon.com/python/pandas_dataframe_importing_csv.html. – JeanPaulDepraz

+0

, пожалуйста, проголосуйте и проверьте правильный ответ, я доставил. – JeanPaulDepraz

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