从字典创建Pandas DataFrame,将list,tuple或dict作为单个条目值

时间:2018-02-21 23:17:45

标签: python pandas

我有一本字典

data = { 'x' : 1,
         'y' : [1,2,3],
         'z' : (4,5,6),
         'w' : {1:2, 3:4}
       }

我想构建一个Pandas DataFrame,以便列表和元组不会被广播:

df = pd.DataFrame(some_transformation(data), index=['a'])

获取

df = 
      x         y         z          w
a     1   (1,2,3)   (4,5,6)  (1,2,3,4)

或者列表/ tuple / dict的某种扁平化和/或字符串化。这样做最简单/最有效的方法是什么,而不必记下每个字典条目的确切数据结构?

4 个答案:

答案 0 :(得分:1)

没有确切的数据结构,我认为实现你想要的最简单的方法是:

      data={k:str(v) for k,v in data}

上面的语句将使所有值都为字符串类型。现在,您可以使用以下行将数据字典转换为数据框:

    df=pd.DataFrame(data, index=[0])

这将以下面的形式为您提供输出:

           w        x          y          z
    0 {1: 2, 3: 4}  1      [1, 2, 3]  (4, 5, 6)

现在为你想要的输出:(你可以使用其他有效的方法在数据帧中替换字符串)

      for acol in df.columns:
            a[acol]=a[acol].values[0].strip('[{()}]')
            a[acol]=a[acol].values[0].replace(':', ',')

输出看起来像

                 w         x        y          z

            1, 2, 3, 4     1    1, 2, 3     4, 5, 6

答案 1 :(得分:0)

您无法将一个转换应用于列表/元组和词典。它们具有非常不同的属性。您可以展平所有词典,然后从更新的词典中创建pd.Series

for key in data:
    if isinstance(data[key],dict):
        data[key] = list(data[key].keys())+list(data[key].values())
pd.Series(data)
#w    [1, 3, 2, 4]
#x               1
#y       [1, 2, 3]
#z       (4, 5, 6)
#dtype: object

如果需要,可将其进一步转换为DataFrame:

df = pd.DataFrame(pd.Series(data)).T
#              w  x          y          z
#0  [1, 3, 2, 4]  1  [1, 2, 3]  (4, 5, 6)

您可以以相同的精神处理列表(将它们转换为元组)。

答案 2 :(得分:0)

这是一种方式。

def transformer(data):
    for k, v in data.items():
        if isinstance(v, list):
            data[k] = [tuple(v)]
        elif isinstance(v, dict):
            data[k] = [tuple(chain(*(v.items())))]
        else:
            data[k] = [v]
    return data

df = pd.DataFrame(transformer(data), index=['a'])

#               w  x          y          z
# a  (1, 2, 3, 4)  1  (1, 2, 3)  (4, 5, 6)

答案 3 :(得分:0)

您可以使用set_value将这些元素分配给df,然后将dict和list转换为元组。

;; the Z combinator 
(define Z
  (lambda (f)
    ((lambda (y)
       (y y))
     (lambda (g)
       (f (lambda args (apply (g g) args)))))))

(define (fib n)
  ((Z (lambda (helper)
        (lambda (n a b)
          (if (zero? n)
              a
              (helper (- n 1) b (+ a b))))))
   n 0 1))

(fib 10) ; ==> 55