индекс pandas кадр данных в эластичном поиске с нулевыми значениями, но без нан - PullRequest
1 голос
/ 19 января 2020

Я индексирую данные из pandas кадра данных вasticsearch. Я установил null_value для некоторых полей es, но не для других. Как удалить столбцы без значения null_value, но оставить столбцы с (значение установки Нет)?

es mapping:

    "properties": {
        "sa_start_date": {"type": "date", "null_value": "1970-01-01T00:00:00+00:00"},
        "location_name": {"type": "text"},

код:

cols_with_null_value = ['sa_start_date']
orig = [{
    'meter_id': 'M1',
    'sa_start_date': '',
    'location_name': ''
},{
    'meter_id': 'M1',
    'sa_start_date': '',
    'location_name': 'a'
}]
df = pd.DataFrame.from_dict(orig)

df['sa_start_date'] = df['sa_start_date'].apply(pd.to_datetime, utc=True, errors='coerce')
df.replace({'': np.nan}, inplace=True)
df:
   meter_id sa_start_date location_name
0       M1           NaT           NaN
1       M1           NaT             a

дикты, необходимые для эластичного индекса поиска:

{"meter_id": M1, "sa_start_date": None}
{"meter_id": M1, "sa_start_date": None, "location_name": "a"}

Обратите внимание, что ячейки location_name с NaN не индексируются, а ячейки sa_start_date с NaT. Я перепробовал много вещей, каждая более нелепая, чем предыдущая; не надо ничего показывать. Любые идеи приветствуются!

Пробовал это, но Nones отбрасываются вместе с NaNs ..

df[null_value_cols] = df[null_value_cols].replace({np.nan: None})
df:
   meter_id sa_start_date location_name
0       M1          None           NaN
1       M1          None             a
for row in df.iterrows():
    ser = row[1]
    ser.dropna(inplace=True)

    lc = {k: v for k, v in dict(row[1]).items()}

lc: {'meter_id': 'M1'}
lc: {'meter_id': 'M1', 'location_name': 'a'}

1 Ответ

3 голосов
/ 19 января 2020

Не используйте .dropna() здесь. Он будет отбрасывать как целые строки, так и целые столбцы; и вы хотите сохранить все, кроме пустых имен местоположений.

Вы можете сделать это следующим образом:

df.replace({'': None}, inplace=True) # replace with None instead of np.nan

for idx,row in df.iterrows(): 
    lc = {k:v for k,v in row.items() if not (k == 'location_name' and v is None)} 
    print(lc) 

Результат:

{'meter_id': 'M1', 'sa_start_date': None}
{'meter_id': 'M1', 'sa_start_date': None, 'location_name': 'a'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...