Python 从变量中的值构造DataFrame给出;ValueError:如果使用所有标量值,则必须传递一个索引";

Python 从变量中的值构造DataFrame给出;ValueError:如果使用所有标量值,则必须传递一个索引";,python,pandas,dataframe,scalar,Python,Pandas,Dataframe,Scalar,这可能是一个简单的问题,但我不知道如何做到这一点。假设我有两个变量,如下所示 a = 2 b = 3 我想从以下内容构造一个数据帧: df2 = pd.DataFrame({'A':a,'B':b}) 这将生成一个错误: ValueError:如果使用所有标量值,则必须传递索引 我也试过: df2 = (pd.DataFrame({'a':a,'b':b})).reset_index() 这会给出相同的错误消息。错误消息说,如果要传递标量值,则必须传递索引。因此,您既可以不为列使用标量值,

这可能是一个简单的问题,但我不知道如何做到这一点。假设我有两个变量,如下所示

a = 2
b = 3
我想从以下内容构造一个数据帧:

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_df = pd.DataFrame(planets)
print(planets_df)

您需要提供iterables作为数据框列的值:

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')

如果您有字典,可以使用以下代码行将其转换为熊猫数据帧:

pd.DataFrame({"key": d.keys(), "value": d.values()})

也许该系列将提供您所需的所有功能:

pd.Series({'A':a,'B':b})
DataFrame可以看作是系列的集合,因此您可以:

  • 将多个系列连接到一个数据帧中(如上所述)

  • 将一个系列变量添加到现有数据框()


  • 这是因为数据帧有两个直观的维度——列和行

    您仅使用字典键指定列


    如果只想指定一维数据,请使用序列

    您需要先创建熊猫系列。第二步是将熊猫系列转换为熊猫数据帧

    import pandas as pd
    data = {'a': 1, 'b': 2}
    pd.Series(data).to_frame()
    
    您甚至可以提供列名

    pd.Series(data).to_frame('ColumnName')
    

    如果要转换标量字典,必须包含索引:

    >>> 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_df = pd.DataFrame(planets)
    print(planets_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)
    
    当然,对于列表字典,您可以构建不带索引的数据框架:

    >>> 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_df = pd.DataFrame(planets)
    print(planets_df)
    
    你可以试试:

    df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
    

    根据“orient”参数的文档:如果传递的dict的键应该是结果数据帧的列,则传递“columns”(默认值)。否则,如果键应该是行,则传递“索引”。

    输入不必是记录列表,也可以是单个字典:

    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
    

    我对numpy阵列也有同样的问题,解决方法是将它们展平:

    data = {
        'b': array1.flatten(),
        'a': array2.flatten(),
    }
    
    df = pd.DataFrame(data)
    

    只需在列表上传递命令:

    a = 2
    b = 3
    df2 = pd.DataFrame([{'A':a,'B':b}])
    

    熊猫在工作。所有的逻辑都是错误的

    错误消息“ValueError:如果使用所有标量值,则必须传递索引”表示必须传递索引

    这并不一定意味着通过索引可以让熊猫做你想让它做的事

    传递索引时,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有很多警告,不要让其他开发人员为了阅读您的代码而不得不求助于所有这些方面的专家。

    您可以尝试将词典包装到列表中

    my_dict={'A':1,'B':2}

    pd.DataFrame([my_dict])


    将字典转换为数据帧

    col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()
    
    为列指定新名称

    col_dict_df.columns = ['col1', 'col2']
    
    你可以试试这个:
    df2=pd.DataFrame.from_dict({'a':a,'b':b},orient='index')

    将'a'和'b'值更改为列表,如下所示:

    a = [2]
    b = [3]
    
    df2 = pd.DataFrame({'A':a,'B':b})
    df2
    
    然后执行如下相同的代码:

    a = [2]
    b = [3]
    
    df2 = pd.DataFrame({'A':a,'B':b})
    df2
    
    您将得到:

        A   B
    0   2   3
    

    我通常使用以下命令从dicts快速创建一个小表

    假设您有一个dict,其中键是文件名及其相应文件大小的值,您可以使用以下代码将其放入数据帧中(注意dict上的.items()调用):

    最简单的选择是:

    dict  = {'A':a,'B':b}
    df = pd.DataFrame(dict, index = np.arange(1) )
    

    另一个选项是使用字典理解动态地将标量转换为列表:

    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]}
    
    我尝试了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
    
    ​```
    

    Dave,你试过这段代码吗(当然,定义a和b)?您仍然收到错误消息吗?你能发布吗?@DaveKielpinski你可能忘了添加括号了吗?这将使用dict键作为列名。如何设置索引键?@DaveKielpinski,请检查您是否将列表传递给“from_records”方法;否则它将无法工作,您将收到与在字典上调用DataFrame时相同的错误消息。与@DaveKielpinski的问题相同,直到我意识到我在单个文档上使用的是来自记录的
    ,而不是在这样的数组上。如果它提醒你仔细检查一下你做的是否正确,那么就发这个帖子吧。它可以工作,但是我觉得它没有多大意义
    `fruits\u count=defaultdict(int)fruits\u count[“apples”]=10个fruits\u count[“banana”]=21pd.DataFrame({“key”:fruits\u count.keys(),“value”:fruits\u count.values())输出:键值0(香蕉,苹果)(21,10)1(香蕉,苹果)(21,10)
    请使用格式化工具正确编辑和格式化您的问题/答案。句子中的代码将被格式化为
    code
    非常重要的词要加粗,次要的词要斜体,必要时也使用列表这并不能解决问题,它会产生不同于预期的结果。也许是这样