【问题标题】:Reduce dictionary dimension to 1将字典维度减少到 1
【发布时间】:2015-11-08 04:50:53
【问题描述】:

我有几个字典要合并到pd.DataFrame。为了能够做到这一点,所有字典的维数都需要为 1。如何将以下字典的维数减少到 1,但使其仍然是字典?如果一个字典项有多个条目,则应该简单地连接它。所以myFunds 应该变成'2.0 0.0'

h = {
    'gameStage': 'PreFlop',
    'losses': 0,
    'myFunds': [2.0, '0.0'],
    'myLastBet': 0,
    'peviousRoundCards': ['2S', 'QS'],
    'previousCards': ['2S', 'QS'],
    'previousPot': 0.03,
    'wins': 0
}

更准确地说,我的问题是:我想将对象的所有属性保存在 DataFrame 中。为此我做了vars(Object),它给了我一本字典,但并非所有条目都具有相同的尺寸,所以我不能做DataFrame(vars(Object)),因为我得到一个错误。这就是为什么我需要先将vars(Object) 转换为一维字典。但它需要保持字典,否则我无法将其转换为DataFrame

【问题讨论】:

标签: python dictionary


【解决方案1】:

您可以遍历字典中的项目,并使用str.join() 将它们展平。

我们基本上告诉它遍历字典值中的每个键/值对,将其转换为字符串(因为您无法连接 intstring),然后将其放回字典

函数funcfrom here,它的作用是确保我们总是有一个可迭代项

from collections import Iterable

def func(x):
    #use str instead of basestring if Python3
    if isinstance(x, Iterable) and not isinstance(x, basestring):
        return x
    return [x]

for key, val in h.items():
    h[key] = " ".join([str(ele) for ele in func(val)])

h 的输出变为:

{
  'gameStage': 'PreFlop', 
  'losses': '0', 
  'myFunds': '2.0 0.0', 
  'myLastBet': '0',
  'peviousRoundCards': '2S QS', 
  'previousCards': '2S QS',
  'previousPot': '0.03',
  'wins': '0'
}

【讨论】:

  • 我认为您不需要列表理解。你可以把它变成一个生成器:" ".join(str(ele) for ele in val)
  • 有些值不是列表。
  • NameError: 未定义全局名称“Iterable”
  • @Nicolas 你需要确保你这样做from collections import Iterable
  • 它更快,python 两次传递你传入的对象,所以如果你传递一个生成器,无论如何都会构建一个列表,所以使用 gen exp 并没有真正的优势,它最终变慢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2022-10-14
  • 2020-06-07
  • 1970-01-01
  • 2017-01-28
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多