【问题标题】:pd dataframe from lists and dictionary using series使用系列的列表和字典中的 pd 数据框
【发布时间】:2021-03-01 07:44:14
【问题描述】:

我的列表和字典很少,想创建一个 pd 数据框。 有人可以帮帮我吗,我似乎遗漏了一些东西:

一个简单的例子如下:

dict={"a": 1, "b": 3, "c": "text1"}
l1 = [1, 2, 3, 4]
l3 = ["x", "y"]

使用系列我会这样做:

df = pd.DataFrame({'col1': pd.Series(l1), 'col2': pd.Series(l3)}) 

并且会按预期在 df 中列出列表

因为 dict 会做

df = pd.DataFrame(list(dic.items()), columns=['col3', 'col4'])

并且期望得到这样的结果:

col1 col2 col3 col4
1     x    a    1
2     y    b    3
3          c  text1
4

问题是这样的,第一个 df 将被 pd.Dataframe 的第二次调用覆盖

如果只有一个 df 有 4 列,我该怎么做?

我知道一种方法是将 dict 拆分为 2 个单独的列表并仅使用 Series 超过 4 个列表,但我认为有更好的方法可以做到这一点,在 2 个列表和 1 个 dict 中直接使用一个 df 有 4 列。

感谢您的帮助

【问题讨论】:

    标签: python-3.x pandas list dataframe dictionary


    【解决方案1】:

    您也可以使用pd.concat 连接两个数据帧。

    df1 = pd.DataFrame({'col1': pd.Series(l1), 'col2': pd.Series(l3)}) 
    df2 = pd.DataFrame(list(dic.items()), columns=['col3', 'col4'])
    df = pd.concat([df1, df2], axis=1)
    

    【讨论】:

      【解决方案2】:

      为什么不通过dict.keys()dict.values() 分别构建每一列,而不是使用dict.items()

      df = pd.DataFrame({
          'col1': pd.Series(l1), 
          'col2': pd.Series(l3), 
          'col3': pd.Series(dict.keys()), 
          'col4': pd.Series(dict.values())
      })
      
      print(df)   
         col1 col2 col3   col4
      0     1    x    a      1
      1     2    y    b      3
      2     3  NaN    c  text1
      3     4  NaN  NaN    NaN
      

      或者:

      column_values = [l1, l3, dict.keys(), dict.values()]
      data = {f"col{i}": pd.Series(values) for i, values in enumerate(column_values)}
      df = pd.DataFrame(data)
      
      print(df)
         col0 col1 col2   col3
      0     1    x    a      1
      1     2    y    b      3
      2     3  NaN    c  text1
      3     4  NaN  NaN    NaN
      

      【讨论】:

        【解决方案3】:

        您可以解压缩从d.items() 生成的list 的压缩值并传递给itertools.zip_longest 以添加缺失值以按列表的最大长度进行匹配:

        #dict is python code word, so used d for variable
        d={"a": 1, "b": 3, "c": "text1"}
        l1 = [1, 2, 3, 4]
        l3 = ["x", "y"]
        
        
        df = pd.DataFrame(zip_longest(l1, l3, *zip(*d.items()),
                                      fillvalue=np.nan), 
                          columns=['col1','col2','col3','col4'])
        print (df)
           col1 col2 col3   col4
        0     1    x    a      1
        1     2    y    b      3
        2     3  NaN    c  text1
        3     4  NaN  NaN    NaN
        

        【讨论】:

          猜你喜欢
          • 2023-02-07
          • 2021-09-06
          • 2021-09-22
          • 2020-02-04
          • 2020-11-12
          • 1970-01-01
          • 2021-08-14
          • 2019-08-01
          • 2021-04-10
          相关资源
          最近更新 更多