这可能是一个简单的问题,但我无法弄清楚如何做到这一点。可以说我有两个变量如下。
a = 2
b = 3
我想从这构造一个DataFrame:
df2 = pd.DataFrame({'A':a,'B':b})
这会产生错误:
ValueError:如果使用所有标量值,则必须传递索引
我也尝试了这个:
df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()
这给出了相同的错误消息。
错误消息说如果您传递标量值,则必须传递索引。因此,您可以不使用列的标量值 - 例如使用清单:
>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
A B
0 2 3
或使用标量值并传递索引:
>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
A B
0 2 3
如果您打算转换标量字典,则必须包含索引:
import pandas as pd
alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)
尽管列表字典不需要索引,但可以将相同的想法扩展为列表字典:
planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)
当然,对于列表字典,您可以构建没有索引的数据帧:
planets_df = pd.DataFrame(planets)
print(planets_df)
这是对@fAx的回复的评论:输入不必是记录列表 - 它也可以是单个字典:
pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
a b
0 1 2
这似乎相当于:
pd.DataFrame({'a':1,'b':2}, index=[0])
a b
0 1 2
熊猫魔法在工作。所有的逻辑都出来了。
错误消息"ValueError: If using all scalar values, you must pass an index"
说您必须传递索引。
这并不一定意味着传递索引会让大熊猫做你想做的事
传递索引时,pandas会将您的字典键视为列名,将值视为列应包含的索引中每个值的值。
a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])
A B
1 2 3
传递更大的索引:
df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])
A B
1 2 3
2 2 3
3 2 3
4 2 3
当没有给出索引时,索引通常由数据框自动生成。但是,大熊猫不知道你想要多少行的2
和3
。但是你可以更明确地说明它
df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2
A B
0 2 3
1 2 3
2 2 3
3 2 3
但默认索引是0。
我建议在创建数据帧时始终将列表字典传递给dataframe构造函数。对其他开发人员来说更容易阅读。熊猫有很多警告,不要让其他开发人员为了阅读你的代码而拥有所有这些专家。
如果您有字典,可以使用以下代码行将其转换为pandas数据框:
pd.DataFrame({"key": d.keys(), "value": d.values()})
将字典转换为数据框
col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()
为Column命名
col_dict_df.columns = ['col1', 'col2']
只需将dict传递到列表中:
a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
您也可以使用pd.DataFrame.from_records
,当您手头有字典时更方便:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }])
如果需要,您还可以通过以下方式设置索引:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
你需要先创建一个熊猫系列。第二步是将pandas系列转换为pandas数据帧。
import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()
您甚至可以提供列名称。
pd.Series(data).to_frame('ColumnName')
您可以尝试将字典包装到列表中
my_dict = {'A':1,'B':2}
pd.DataFrame([my_dict])
A B
0 1 2
您需要提供iterables作为Pandas DataFrame列的值:
df2 = pd.DataFrame({'A':[a],'B':[b]})
也许Series会提供你需要的所有功能:
pd.Series({'A':a,'B':b})
DataFrame可以被认为是系列的集合,因此您可以:
我遇到了与numpy数组相同的问题,解决方法是将它们展平:
data = {
'b': array1.flatten(),
'a': array2.flatten(),
}
df = pd.DataFrame(data)
你可以尝试:
df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
从'orient'参数的文档中:如果传递的dict的键应该是结果DataFrame的列,则传递'columns'(默认值)。否则,如果键应该是行,则传递'index'。
这是因为DataFrame有两个直观的维度 - 列和行。
您只使用字典键指定列。
如果您只想指定一维数据,请使用系列!