我有一本字典
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的某种扁平化和/或字符串化。这样做最简单/最有效的方法是什么,而不必记下每个字典条目的确切数据结构?
答案 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