【问题标题】:Creating Pandas DataFrame from list or dict always returns empty DF从 list 或 dict 创建 Pandas DataFrame 总是返回空 DF
【发布时间】:2019-04-25 18:49:46
【问题描述】:

我正在尝试从字典中创建一个 pandas 数据框。字典键是字符串,值是 1 个或多个列表。我遇到了一个奇怪的问题,其中 pd.DataFrame() 命令始终返回一个空数据帧,即使我将它传递给一个非空对象(如列表或字典)也是如此。 我的代码类似于以下:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],[2,34,11],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

所以我想创建一个如下所示的 DF:

    A  B  C 
ID1 1  2  3
ID2 10 11 12
ID2 2  34 11
ID3 8  3  12

当我检查 df 的内容时,我得到“Empty DataFrame”,如果我遍历它的内容,我只得到列名,而 myDictionary 中没有任何数据!我检查了文档,这应该是一个简单的命令:

pd.DataFrame(dict, columns)

这并没有让我得到我正在寻找的结果,我很困惑为什么。有人有想法么?谢谢!

【问题讨论】:

  • 你想用 ID2 做什么?这不是字典的正确键:值对。
  • 嗨,我正在尝试创建一个字典,其中每个 ID 都有一个或多个列表。所以我可以有同一个 ID 的多条记录,我想将它们组合在同一个键下。所以我猜这些值将是一个列表列表!例如 {"ID2":[[list1],[list2]]} 这有意义吗?
  • 没有。如果是这种情况,您需要将其列为一个列表,并确保将 nan 值添加到 ID1 和 ID2 以确保它们都具有相同数量的值,否则将无法编译。
  • 嗨,我刚刚编辑了我的问题以包含我想要的数据框。我明白你对 NaN 的看法。这将使每个键具有相同数量的值。一个问题是我不会提前知道一个 ID 是否有 1 个列表或 2 个或 3 个等。
  • IIUC,"ID2":[10,11,12],[2,34,11] 应该是 "ID2":[[10,11,12],[2,34,11]]

标签: python pandas dataframe


【解决方案1】:

在这种情况下,我建议您将列表列表解释为字符串。稍后,如果您需要编辑或分析其中任何一个,您可以使用解析器来解释这些列。

请参阅下面的工作代码,该代码允许您将列表列表保留在数据框中。

myDictionary = {"ID1":'[1,2,3]', "ID2":'[10,11,12],[2,34,11]',"ID3":'[8,3,12]'}


df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"], index = [0])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
df.head(3)

通过始终将列表转换为字符串,您将能够更轻松地组合它们,无论有多少列表需要组合。

【讨论】:

    【解决方案2】:

    试试下面的例子,看看为什么 df 是空的:

    myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12], 'A':[0, 0, 0]}
    df = pd.DataFrame(myDictionary, columns = ["A","B","C"])
    

    而你想要的是:

    myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12]}
    df = pd.DataFrame(myDictionary).rename(columns={'ID1':'A', 'ID2':'B', 'ID3':'C'})
    

    【讨论】:

      【解决方案3】:

      您将名称“ID1”、“ID2”和“ID3”作为列名传入 pd.DataFrame,然后告诉熊猫使用 A、B、C 列。由于没有 A、B 列, C pandas 返回一个空的DataFrame。使用以下代码制作 DataFrame:

      import pandas as pd
      
      myDictionary = {"ID1": [1, 2, 3], "ID2": [10, 11, 12], "ID3": [8, 3, 12]}
      df = pd.DataFrame(myDictionary, columns=["ID1", "ID2", "ID3"])
      print(df)
      

      输出:

         ID1  ID2  ID3
      0    1   10    8
      1    2   11    3
      2    3   12   12
      

      还有这个:

      "ID2":[10,11,12],[2,34,11]
      

      不正确,因为您要么尝试为字典中的一个值传递 2 个键,要么忘记为值 [2,34,11] 创建一个键。因此,除非您删除该列表,否则当您尝试编译时,您的字典应该会返回错误。

      【讨论】:

        【解决方案4】:

        首先,[2,34,11] 列表缺少列名。给它一个名字!

        你的错误的原因是当你使用以下命令时:

        df = pd.DataFrame(myDictionary, columns = ["A","B","C"])
        

        它会根据您的字典创建一个数据框。但是你说你只想要字典中标记为“A”、“B”、“C”的列,而你的字典没有这些列。

        试试吧:

        df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"])
        df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
        

        【讨论】:

          【解决方案5】:

          您不能创建两个行级别与您的示例相同的数据框

          ID2 10 11 12
          ID2 2  34 11
          

          同时,字典也是如此,在字典中每个键都必须是唯一的,但在你的数据框中,像下面的字典一样,这是不可能的

          {"ID2":[10,11,12],"ID2":[2,34,11]}
          

          所以我的建议是改变你的字典设计并遵循许多关于将字典转换为 df 的答案

          【讨论】:

            【解决方案6】:

            这是一种可能的方法

            字典

            myDictionary = {"ID1":[1,2,3], "ID2":[[10,11,12],[2,34,11]],"ID3":[8,3,12]}
            

            获取一个字典 d,其中包含 嵌套列表的值的键值,其 (a) 键是唯一的 - 使用后缀来确保此字典 d 的键是唯一的(b) 其值是嵌套列表中的扁平子列表

            • 为此,遍历循环并
              • check 如果值包含子列表
                • 如果是这样,请将 key:value 对附加到单独的字典 d
                  • 使用后缀分隔相同的键,因为键 ID2 不能在字典中重复
                    • 每个后缀都将包含嵌套列表中的一个子列表
                  • 从原始字典(在名为nested_keysmyDictionary的变量中)生成键列表,其值是嵌套列表
            d = {}
            nested_keys = []
            for k,v in myDictionary.items():
                if any(isinstance(i, list) for i in v):
                    for m,s in enumerate(v):
                        d[k+'_'+str(m+1)] = s
                    nested_keys.append(k)
            
            print(d)
            {'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11]}
            

            (使用值嵌套列表的键列表 - nested_keys)获取第二个字典,其中包含不是嵌套列表的值 - 请参阅this SO post如何做到这一点

            myDictionary = {key: myDictionary[key] for key in myDictionary if key not in nested_keys}
            
            print(myDictionary)
            {'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}
            

            Combine 将上述2个字典合并为一个字典

            myDictionary = {**d, **myDictionary}
            
            print(myDictionary)
            {'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11], 'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}
            

            将组合字典转换为DataFrame,并去掉之前添加的后缀

            df = pd.DataFrame(list(myDictionary.values()), index=myDictionary.keys(),
                                                            columns=list('ABC'))
            df.reset_index(inplace=True)
            df = df.replace(r"_[0-9]", "", regex=True)
            df.sort_values(by='index', inplace=True)
            
            print(df)
              index   A   B   C
            2   ID1   1   2   3
            0   ID2  10  11  12
            1   ID2   2  34  11
            3   ID3   8   3  12
            

            【讨论】:

              猜你喜欢
              • 2021-11-26
              • 1970-01-01
              • 2018-02-03
              • 2013-12-18
              • 1970-01-01
              • 2021-07-02
              • 2017-08-08
              • 2019-07-08
              • 1970-01-01
              相关资源
              最近更新 更多