【问题标题】:index pandas dataframe in elasticsearch with null values but no nan在弹性搜索中使用空值但没有 nan 索引 pandas 数据帧
【发布时间】:2020-01-19 10:28:09
【问题描述】:

我正在从 elasticsearch 中的 pandas 数据框中索引数据。 我为某些 es 字段设置了 null_value,但没有为其他字段设置。 如何删除没有 null_value 的列但保留那些(将值设置为 None)?

es 映射:

    "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"}

注意,带有 NaN 的 location_name 单元格不被索引,但带有 NaT 的 sa_start_date 单元格被索引。 我尝试了很多事情,每一个都比上一个更荒谬;没有什么值得展示的。 任何想法表示赞赏!

试过了,但是 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'}

【问题讨论】:

    标签: pandas elasticsearch


    【解决方案1】:

    不要在这里使用.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'}
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2016-02-11
      • 2012-09-07
      • 2015-12-13
      • 2019-10-10
      • 2018-10-29
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多