如何将 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.core.frame.DataFrame 转换为列表?
python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?