这可能是一个简单的问题,但是我无法弄清楚如何做到这一点。假设我有两个变量如下。
a = 2
b = 3
我想从这个构建一个DataFrame:
df2 = pd.DataFrame({'A':a,'B':b})
这会产生一个错误:
ValueError:如果使用所有标量值,必须传递索引
我也尝试了这个:
df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()
这会给出相同的错误信息。
这可能是一个简单的问题,但是我无法弄清楚如何做到这一点。假设我有两个变量如下。
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
index=0
,但这可能会导致意外的误用(认为单个字典可以创建多行数据帧)。 - Orimy_dict = {'A':1,'B':2}
pd.DataFrame([my_dict])
A B
0 1 2
[ ]
中,即可适用于包含多种数据类型的大型字典。由于需要对所有标量值执行此操作,因此所接受的答案并不是很快,感谢! - Elias.transpose()
非常有用,可以将宽表转换为长表,即pd.DataFrame([my_dict]).transpose()
。 - mellifluous如果您已经有了字典,您也可以使用pd.DataFrame.from_records
,这将更加方便:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }])
如果需要,您还可以通过以下方式设置索引:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
from_records
,而不是在这些文档的数组上使用。只是发帖提醒你要仔细检查是否做对了。 - Voy您需要首先创建一个 Pandas Series。第二步是将 Pandas Series 转换为 Pandas DataFrame。
import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()
您甚至可以提供列名称。
pd.Series(data).to_frame('ColumnName')
pd.Series(data).to_frame('ColumnName')
可以更简洁地表达,但这个等同形式也可以更直接地表示:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
。 - Alex F熊猫(Pandas)的神奇之处正在发挥作用,所有逻辑都被抛在了脑后。
错误信息"ValueError: If using all scalar values, you must pass an index"
指出您必须传递一个索引。
这并不一定意味着传递一个索引会使熊猫(Pandas)做你想让它做的事情
当您传递一个索引时,熊猫(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
如果未指定,则数据帧通常会自动生成索引。但是,pandas不知道您需要多少行的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的。
我建议在创建数据框时,始终向数据框构造函数传递一个列表字典。这对其他开发人员更易于阅读。Pandas有很多注意事项,请不要让其他开发人员成为所有问题的专家才能阅读您的代码。
我通常使用以下代码从字典快速创建一个小表格。
假设你有一个字典,其中键是文件名,值是相应的文件大小,你可以使用以下代码将其放入DataFrame中(注意在字典上调用 .items()):
files = {'A.txt':12, 'B.txt':34, 'C.txt':56, 'D.txt':78}
filesFrame = pd.DataFrame(files.items(), columns=['filename','size'])
print(filesFrame)
filename size
0 A.txt 12
1 B.txt 34
2 C.txt 56
3 D.txt 78
你可以尝试:
df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
从“orient”参数的文档中可以看到:如果传递的字典的键应该是生成的DataFrame的列,则传递“columns”(默认)。否则,如果键应该是行,则传递“index”。
orient='columns'
时,它只会给出与原始问题相同的 如果使用所有标量值,则必须传递索引
错误。我应该在我的评论中澄清这一点。 - Ken Williamsdf_array_like = pd.DataFrame({
'col' : 10086,
'col_2' : True,
'col_3' : "'at least one array'",
'col_4' : ['one array is arbitrary length', 'multi arrays should be the same length']})
print("df_array_like: \n", df_array_like)
输出:
df_array_like:
col col_2 col_3 col_4
0 10086 True 'at least one array' one array is arbitrary length
1 10086 True 'at least one array' multi arrays should be the same length
原因是标量值(整数、布尔值和字符串)没有索引。ValueError("If using all scalar values, you must pass an index")
df_scalar_value = pd.DataFrame({
'col' : 10086,
'col_2' : True,
'col_3' : "'at least one array'"
}, index = ['fst_row','snd_row','third_row'])
print("df_scalar_value: \n", df_scalar_value)
输出:
df_scalar_value:
col col_2 col_3
fst_row 10086 True 'at least one array'
snd_row 10086 True 'at least one array'
third_row 10086 True 'at least one array'
我是一名初学者,正在学习Python和英语。
df2 = pd.DataFrame({'A':[a],'B':[b]})
.foo()
就可以解决错误,因为异常是在评估DataFrame构造函数时产生的吗? - Lucas Alonso