【问题标题】:Pandas: sparse dataframe to dictionary without nan valuesPandas:稀疏数据框到没有 nan 值的字典
【发布时间】:2019-09-25 19:25:05
【问题描述】:

我有一个大型稀疏数据框sdf 主要包含NaN。当我使用sdf.to_dict() 时,它会输出该矩阵的密集版本,其中填充了所有null 值。我怎么能省略那些 NaN 条目,而只有输出条目才对字典有价值?

例如,sdf 是:

          2018-02-02  2018-02-03
23:58:36         NaN         NaN
23:58:37         1.0         NaN
23:58:40         NaN         NaN
23:58:41         NaN         NaN
23:58:42         NaN         NaN
23:58:43         NaN         NaN
23:58:48         NaN         NaN
23:58:49         NaN         NaN
23:58:50         NaN         NaN
23:58:52         NaN         1.0
23:58:59         NaN         NaN
23:59:00         NaN         NaN
23:59:01         NaN         NaN
23:59:05         NaN         NaN
23:59:07         NaN         NaN

stf.to_dict() 会给出:

{'2018-02-02': {'23:58:36': nan, '23:58:37': 1.0, '23:58:40':
  nan, '23:58:41': nan, '23:58:42': nan, '23:58:43': nan,
  '23:58:48': nan, '23:58:49': nan, '23:58:50': nan, '23:58:52':
  nan, '23:58:59': nan, '23:59:00': nan, '23:59:01': nan,
  '23:59:05': nan, '23:59:07': nan}, '2018-02-03': {'23:58:36':
  nan, '23:58:37': nan, '23:58:40': nan, '23:58:41': nan,
  '23:58:42': nan, '23:58:43': nan, '23:58:48': nan, '23:58:49':
  nan, '23:58:50': nan, '23:58:52': 1.0, '23:58:59': nan,
  '23:59:00': nan, '23:59:01': nan, '23:59:05': nan, '23:59:07':
  nan}}

即使sdf 也是一个稀疏数据框。


对不起,模棱两可。我想保留所有非 NaN 条目。所需的输出是

{'2018-02-02': {'23:58:37': 1.0}, '2018-02-03': {'23:58:52': 1.0}}

【问题讨论】:

  • 您是否尝试删除 NaN 行并转换为字典。 sdf.dropna(how='all').to_dict()?
  • @SaiKumar 请看我的更新:D

标签: python pandas


【解决方案1】:

stackdict comprehension 一起使用:

from collections import defaultdict
d = defaultdict(dict)
for (k1, k2), v in df.stack().items():
    d[k2][k1] = v

d1 = dict(d)

如果输入是SeriesDatetimeIndex

print (s)
2018-02-02 23:58:37    1.0
2018-02-03 23:58:52    1.0
dtype: float64

from collections import defaultdict
d = defaultdict(dict)
for k, v in df.stack().items():
    d[k.strftime('%Y-%m-%d')][k.strftime('%H:%M:%S')] = v

d1 = dict(d)

【讨论】:

  • @LukasThaler - 谢谢,解决方案已更改。
【解决方案2】:

this 答案的改编将完全符合您的要求

from math import isnan

sdd = sdf.dropna(how = 'all').to_dict()
clean_dict = {k: {j: sdd[k][j] for j in sdd[k] if not isnan(sdd[k][j])} for k in sdd}

【讨论】:

    【解决方案3】:

    到目前为止,对我来说这是最好的方法。

    from pandas import isnull
    
    [{k:i for k, i in row.iteritems() if not isnull(i)} for c, row in df.iterrows()]
    

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2018-08-05
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2019-03-10
      • 2014-05-24
      相关资源
      最近更新 更多