如何将 pandas DataFrame 转换为省略 NaN 值的字典列表?

Posted

技术标签:

【中文标题】如何将 pandas DataFrame 转换为省略 NaN 值的字典列表?【英文标题】:How to convert a pandas DataFrame to a list of dictionaries where NaN values are omitted? 【发布时间】:2018-05-12 15:34:17 【问题描述】:

这个问题类似于Pandas DataFrame to List of Dictionaries,除了DataFrame 不是'full':其中有一些nan 值。假设我从字典列表中生成一个DataFrame,如下所示:

import pandas as pd

data = ['foo': 1, 'bar': 2, 'foo': 3]
df = pd.DataFrame(data)

所以生成的df 看起来像

   bar  foo
0  2.0    1
1  NaN    3

我想要一个将df 转换回原始data 字典列表的函数。不幸的是,

assert df.to_dict('records') == data

失败,因为前者是

['bar': 2.0, 'foo': 1.0, 'bar': nan, 'foo': 3.0]

在第二项中添加了额外的 'bar': nan 键值对。如何找回原来的data

【问题讨论】:

【参考方案1】:

我设法通过一些“后处理”解决了这个问题:

import pandas as pd

data = ['foo': 1, 'bar': 2, 'foo': 3]
df = pd.DataFrame(data)

result = df.to_dict('records')
result2 = [k: v for k, v in row.items() if not pd.isnull(v) for row in result]

assert result2 == data

欢迎使用更优雅的解决方案。

【讨论】:

【参考方案2】:

IIUC

第一个选项

df.apply(lambda x: [x.dropna().to_dict()], axis=1).sum()
Out[860]: ['bar': 2.0, 'foo': 1.0, 'foo': 3.0]

第二个选项

df.stack().groupby(level=0).apply(lambda x: [x.reset_index(level=0,drop=True).to_dict()]).sum()
Out[867]: ['bar': 2.0, 'foo': 1.0, 'foo': 3.0]

【讨论】:

【参考方案3】:

这是另一种方法:

df.T.apply(lambda x: x.dropna().to_dict()).tolist()

输出:

['bar': 2.0, 'foo': 1.0, 'foo': 3.0]

【讨论】:

以上是关于如何将 pandas DataFrame 转换为省略 NaN 值的字典列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

如何将嵌套字典转换为 pandas DataFrame?

如何将 pandas.core.frame.DataFrame 转换为列表?

python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?

如何将 Pydantic BaseModels 列表转换为 Pandas Dataframe

如何将pandas dataframe进行groupby操作后得到的数据结构转换为dataframe?