使用pandas to_dict时排除NaN值

4

我正在使用一个包含一些NaN值的pandas DataFrame,例如:

import pandas as pd
import numpy as np

raw_data={'hostname':{1:'server1',2:'server2',3:'server3',4:'server4'},'nic':{1:'eth1',2:'eth1',3:'eth1',4:'eth1'},'vlan':{1:'100',2:np.nan,3:'200',4:np.nan}}

df=pd.DataFrame(raw_data)

df
  hostname   nic vlan
1  server1  eth1  100
2  server2  eth1  NaN
3  server3  eth1  200
4  server4  eth1  NaN

我会尽力完成翻译任务,以下是您需要翻译的内容:

然后我应用一些过滤并创建字典:

my_dict = df.loc[df['hostname'] == 'server2'].drop('hostname', axis=1).to_dict(orient='records')

my_dict
[{'nic': 'eth1', 'vlan': nan}]

问题是我想在输出的字典中排除任何具有NaN值的键,因此server2的输出将是:
my_dict
[{'nic': 'eth1']

我在这里找到了一个可能的解决方案:将 Pandas DataFrame 转换为字典并删除 NaN 值
from pandas import compat

def to_dict_dropna(data):
  return dict((k, v.dropna().to_dict()) for k, v in compat.iteritems(data))

my_dict=to_dict_dropna(df)

my_dict
{'nic': {1: 'eth1', 2: 'eth1', 3: 'eth1', 4: 'eth1'}, 'hostname': {1: 'server1', 2: 'server2', 3: 'server3', 4: 'server4'}, 'vlan': {1: '100', 3: '200'}}

但是我不知道如何将这个解决方案与我的其他过滤和使用orient ='records'选项的要求结合起来。

基本上,我需要将上述to_dict_dropna函数与我现有的Pandas选项字符串组合在一起。有人能建议一个解决方案吗?谢谢。

1个回答

3

在您的解决方案之后使用列表推导式:

my_dict = (df.loc[df['hostname'] == 'server2']
             .drop('hostname', axis=1)
             .to_dict(orient='records'))

my_dict = [{k:v for k, v in x.items() if v == v } for x in my_dict]
print (my_dict)
[{'nic': 'eth1'}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接