这可能是一个简单的问题,但我无法弄清楚如何做到这一点。可以说我有两个变量如下。
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
当您已经拥有字典时,您还可以使用pd.DataFrame.from_records
哪个更方便:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }])
如果需要,您还可以通过以下方式设置索引:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
您可以尝试将您的字典包装成一个列表:
my_dict = {'A':1,'B':2}
pd.DataFrame([my_dict])
A B
0 1 2
您需要先创建一个熊猫系列。第二步是将熊猫系列转换为熊猫数据框。
import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()
您甚至可以提供列名。
pd.Series(data).to_frame('ColumnName')
熊猫魔术在工作。所有的逻辑都出来了。
错误消息"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
当没有给出索引时,通常由数据框自动生成索引。2
但是,pandas 不知道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 有很多警告,不要让其他开发人员必须成为所有这些方面的专家才能阅读您的代码。
我对 numpy 数组有同样的问题,解决方案是将它们展平:
data = {
'b': array1.flatten(),
'a': array2.flatten(),
}
df = pd.DataFrame(data)
您需要提供可迭代对象作为 Pandas DataFrame 列的值:
df2 = pd.DataFrame({'A':[a],'B':[b]})
我通常使用以下方法从字典中快速创建一个小表。
假设您有一个字典,其中键是文件名,值是它们对应的文件大小,您可以使用以下代码将其放入 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' 参数的文档中:如果传递的 dict 的键应该是结果 DataFrame 的列,则传递 'columns' (默认)。否则,如果键应该是行,则传递“索引”。
import pandas as pd
a=2
b=3
dict = {'A': a, 'B': b}
pd.DataFrame(pd.Series(dict)).T
# *T :transforms the dataframe*
Result:
A B
0 2 3
输入不必是记录列表 - 它也可以是单个字典:
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
我尝试了 transpose() 并且它有效。缺点:您创建了一个新对象。
testdict1 = {'key1':'val1','key2':'val2','key3':'val3','key4':'val4'}
df = pd.DataFrame.from_dict(data=testdict1,orient='index')
print(df)
print(f'ID for DataFrame before Transpose: {id(df)}\n')
df = df.transpose()
print(df)
print(f'ID for DataFrame after Transpose: {id(df)}')
输出
0
key1 val1
key2 val2
key3 val3
key4 val4
ID for DataFrame before Transpose: 1932797100424
key1 key2 key3 key4
0 val1 val2 val3 val4
ID for DataFrame after Transpose: 1932797125448
```
如果您打算转换标量字典,则必须包含一个索引:
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)
这是因为 DataFrame 有两个直观的维度——列和行。
您仅使用字典键指定列。
如果您只想指定一维数据,请使用系列!
最简单的选项 ls :
dict = {'A':a,'B':b}
df = pd.DataFrame(dict, index = np.arange(1) )
另一种选择是使用 Dictionary Comprehension 将标量动态转换为列表:
df = pd.DataFrame(data={k: [v] for k, v in mydict.items()})
表达式 {...} 创建一个新的 dict,其值是 1 个元素的列表。如 :
In [20]: mydict
Out[20]: {'a': 1, 'b': 2}
In [21]: mydict2 = { k: [v] for k, v in mydict.items()}
In [22]: mydict2
Out[22]: {'a': [1], 'b': [2]}
将字典转换为数据框
col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()
为列赋予新名称
col_dict_df.columns = ['col1', 'col2']
将“a”和“b”值更改为列表,如下所示:
a = [2]
b = [3]
然后执行相同的代码如下:
df2 = pd.DataFrame({'A':a,'B':b})
df2
你会得到:
A B
0 2 3
要弄清楚“ValueError”,需要了解 DataFrame 和“标量值”。
要从dict创建 Dataframe ,至少需要一个 Array。
IMO,数组本身是索引的。
因此,如果存在类似数组的值,则无需指定索引。
eg ['a', 's', 'd', 'f'] 中每个元素的索引分别为0,1,2,3。
df_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
如输出所示,DataFrame的索引为0和1。
与数组的索引一致['一个数组是任意长度','多个数组应该是相同的长度']
如果注释掉'col_4',它会提高
ValueError("如果使用所有标量值,则必须传递一个索引")
原因标量值(整数、布尔值和字符串)没有索引
请注意,必须使用某种集合调用 Index(...)
因为用于定位 DataFrame 索引的所有行的
索引应该是一个数组。例如
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.from_dict({'a':a,'b':b}, orient = 'index')
如果您有字典,则可以使用以下代码行将其转换为 pandas 数据框:
pd.DataFrame({"key": d.keys(), "value": d.values()})
只需在列表中传递 dict:
a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])