2017-01-27 3 views
1

У меня есть HDFStore, где я вводить данные каждую ночь. Я задаюсь вопросом, сбой системы и т. Д., Я мог бы перезапустить процессы, поэтому я хочу убедиться, что если уже существует строка, в которой pandas не включает это при следующем запуске процесса. Есть ли способ искать дубликаты и не включать их?Pandas HDFStore: Опуская дубликаты

+1

Это немного расплывчатый, правильный путь - это сообщение, в котором четко указывается, какой процесс вы выполняете, чтобы мы могли найти вам лучшее решение в соответствии с вашими потребностями. – Shubham

+1

Я согласен с @SRingne. Было бы полезно узнать, есть ли у вас что-то похожее на «первичный ключ», который помогает __uniquely__ идентифицировать каждую строку ... Можете ли вы разместить образец данных (3-5 строк)? – MaxU

ответ

3

Если у вас есть уникальный индекс в вашем HDFStore вы можете использовать следующий подход:

создать образец DF:

In [34]: df = pd.DataFrame(np.random.rand(5,3), columns=list('abc')) 

In [35]: df 
Out[35]: 
      a   b   c 
0 0.407144 0.972121 0.462502 
1 0.044768 0.165924 0.852705 
2 0.703686 0.156382 0.066925 
3 0.912794 0.362916 0.866779 
4 0.156249 0.625272 0.360799 

сохранить его в HDFStore:

In [36]: store = pd.HDFStore(r'd:/temp/t.h5') 

In [37]: store.append('test', df, format='t') 

Добавить новую строку в наш DF:

In [38]: df.loc[len(df)] = [-1, -1, -1] 

In [39]: df 
Out[39]: 
      a   b   c 
0 0.407144 0.972121 0.462502 
1 0.044768 0.165924 0.852705 
2 0.703686 0.156382 0.066925 
3 0.912794 0.362916 0.866779 
4 0.156249 0.625272 0.360799 
5 -1.000000 -1.000000 -1.000000 # new row, which is NOT in the HDF file 

выберите индексы дублированных строк:

In [40]: idx = store.select('test', where="index in df.index", columns=['index']).index 

проверка:

In [41]: df.query("index not in @idx") 
Out[41]: 
    a b c 
5 -1.0 -1.0 -1.0 

Append к HDFStore только те строки, которые еще не были сохранены:

In [42]: store.append('test', df.query("index not in @idx"), format='t') 

проверка:

In [43]: store.select('test') 
Out[43]: 
      a   b   c 
0 0.407144 0.972121 0.462502 
1 0.044768 0.165924 0.852705 
2 0.703686 0.156382 0.066925 
3 0.912794 0.362916 0.866779 
4 0.156249 0.625272 0.360799 
5 -1.000000 -1.000000 -1.000000 # new row has been added 
+0

После попытки этого решения он отлично работает для небольших (~ 1 ГБ) HDF-магазинов, но с большими таблицами время поиска для индекса запроса не в @ idx' слишком большой. Это не будет проблемой, если вы хотите добавить данные редко, но в моем случае, потому что я «злоупотребляю» HDFstore, как если бы это была база данных, задержка слишком велика. –

+1

@MakisTsantekidis, IMO это вполне естественно - мы хотим проверить дубликаты в индексе во всем файле HDF. Таким образом, чем больше HDF-файл, тем дольше он будет работать. В зависимости от вашего конкретного случая вы можете проверить «max (index)» в файле HDF и сравнить значения индекса в DF с этим «max_index_value» ... – MaxU

+0

хорошее предложение, если индексы входящих «записей» отсортированы. Моя идея ускорения в случаях, когда индексы не поступают упорядоченным образом, заключается в том, чтобы запросить один раз для существующих (дублированных) индексов и сохранить их в памяти, чтобы проверить следующую партию записей. –

0

если вы получили dataframe в вашем коде, вы можете добавить данные в любом случае и применить к нему:

.drop_duplicates() 

, который удалит любые дублированные данные из dataframe.

надежда, что помогает

+0

К сожалению, данные слишком велики для хранения в кадре данных, поэтому этот подход может не работать – CodeGeek123

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