【问题标题】:Create DataFrame from dict with lists as values从 dict 以列表为值创建 DataFrame
【发布时间】:2017-06-23 09:14:00
【问题描述】:

我有一本字典,想把它转换成一个数据框。由于不重要的原因,数据框必须在操作之前存在于空状态,所以我使用此代码:

dfResult =  pd.DataFrame()
d={}
d['p1']=123
d['p2']='foo'
#d['p3']= [10,10]
df = pd.DataFrame(d, index=[0]) #index is irrelevant

我工作正常,除非当其中一个值是列表时失败并显示此消息:

ValueError: could not broadcast input array from shape (2) into shape (1)

知道如何解决这个问题吗?

谢谢

【问题讨论】:

  • 你应该去掉index=[0],因为d['p3']是二维的,python会相应生成索引,你可以使用df.index = newIndex修改它跨度>

标签: python python-2.7 pandas dataframe


【解决方案1】:

我认为你可以指定列名:

d={}
d['p1']=123
d['p2']='foo'
d['p3']= [10,10]
df = pd.DataFrame({'col':d})
print (df)
         col
p1       123
p2       foo
p3  [10, 10]

或者可以创建Series:

s = pd.Series(d)
print (s)
p1         123
p2         foo
p3    [10, 10]
dtype: object

DataFrame 构造函数也对我有用,但列表值被转换为标量:

d={}
d['p1']=123
d['p2']='foo'
d['p3']= [10,5]
df = pd.DataFrame(d)
print (df)
    p1   p2  p3
0  123  foo  10
1  123  foo   5

如果需要列名,可以使用DataFrame.from_dict 并转置T

df = pd.DataFrame.from_dict(d, orient='index').T
print (df)
    p2        p3   p1
0  foo  [10, 10]  123 

或者可以对嵌套的lists 使用字典推导:

print ({k:[v] for k,v in d.items()})
{'p2': ['foo'], 'p3': [[10, 10]], 'p1': [123]}

df = pd.DataFrame({k:[v] for k,v in d.items()})
print (df)
    p1   p2        p3
0  123  foo  [10, 10]

【讨论】:

  • 嘿,感谢您的回复,但“ps”应该是列,而不是行....您的最后一个示例产生两行
【解决方案2】:
dfResult =  pd.DataFrame()
d={}
d['p1']=123
d['p2']='foo'
d['p3']= [10,10]
d = {k:[v] if type(v) is list else v for k,v in d.items()}
df = pd.DataFrame(d, index=[0]) #index is irrelevant

然后就可以了

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2013-12-18
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2018-06-11
    • 2018-10-14
    • 2021-12-03
    相关资源
    最近更新 更多