【问题标题】:How do I extract elements from a list in a pandas dataframe column?如何从 pandas 数据框列中的列表中提取元素?
【发布时间】:2021-11-30 16:31:29
【问题描述】:

我有以下列表:

dates = ['12/29/2020', '12/25/2020', '12/22/2020']
numbers = [ [1, 31, 35], [17, 23, 36], [29, 53, 56] ]

我用它们制作了一个 DataFrame:

df = pd.DataFrame(
    {
        'date':dates,
        'nums': numbers
    }
)

这给了我一个包含两列的 DataFrame。我想分解列表中的元素以创建 3 列(列表中的每个数字一个)以最终得到以下 DataFrame:

     date            num1 num2 num3 
0    '12/29/2020'    1    31   35
1    '12/25/2020'    17   23   36
2    '12/22/2020'    29   53   56

我该怎么做?

【问题讨论】:

    标签: pandas list dataframe


    【解决方案1】:

    因此,其他答案充分涵盖了您需要修复已经存在的数据框的情况,但如果您有机会,只需修复您的数据之前会容易得多/em> 创建一个数据框:

    In [1]: import pandas as pd
    
    In [2]: dates = ['12/29/2020', '12/25/2020', '12/22/2020']
    
    In [3]: numbers = [[1, 31, 35], [17, 23, 36], [29, 53, 56]]
    
    In [4]: nums = {f"num{i}": n for i, n in enumerate(zip(*numbers), 1)}
    
    In [5]: df = pd.DataFrame({"dates": dates, **nums})
    
    In [6]: df
    Out[6]:
            dates  num1  num2  num3
    0  12/29/2020     1    31    35
    1  12/25/2020    17    23    36
    2  12/22/2020    29    53    56
    

    或者,另一种方式:

    In [7]: data = [[date, *nums] for date, nums in zip(dates, numbers)]
    
    In [8]: pd.DataFrame(data, columns=["dates", "num1", "num2", "num3"])
    Out[8]:
            dates  num1  num2  num3
    0  12/29/2020     1    31    35
    1  12/25/2020    17    23    36
    2  12/22/2020    29    53    56
    

    【讨论】:

      【解决方案2】:

      您可以像这样使用数据框构造函数:

      pd.DataFrame(numbers, 
                   index=dates, 
                   columns=[f'num{i+1}' for i in range(len(numbers))])\
        .rename_axis('dates').reset_index()
      

      输出:

              dates  num1  num2  num3
      0  12/29/2020     1    31    35
      1  12/25/2020    17    23    36
      2  12/22/2020    29    53    56
      

      【讨论】:

        【解决方案3】:

        创建一个新的数据框并将其加入:

        >>> df[['date']].join(pd.DataFrame(df['num'].tolist()).rename(lambda x: f'num{x + 1}', axis=1))
                 date  num1  num2  num3
        0  12/29/2020     1    31    35
        1  12/25/2020    17    23    36
        2  12/22/2020    29    53    56
        >>> 
        

        或者只是add_prefix:

        >>> df[['date']].join(pd.DataFrame(df['num'].tolist()).add_prefix('num'))
                 date  num0  num1  num2
        0  12/29/2020     1    31    35
        1  12/25/2020    17    23    36
        2  12/22/2020    29    53    56
        >>> 
        

        【讨论】:

        • 并不是说它非常重要,但是根据 OP 的示例,num 列上的数字后缀应该从 1 开始。您的第二个解决方案没有反映这一点。
        • @ddejohn OP 仍然可以使用第一个解决方案。
        • 当然,再一次,不是那么重要,但需要注意一个小细节。
        • @ddejohn Psidom 的回答被接受...
        【解决方案4】:

        nums 列创建一个新的数据框,首先将其转换为列表,然后与date 列连接:

        pd.concat([df.date, pd.DataFrame(df.nums.to_list()).add_prefix('num')], axis=1)
        
                 date  num0  num1  num2
        0  12/29/2020     1    31    35
        1  12/25/2020    17    23    36
        2  12/22/2020    29    53    56
        

        【讨论】:

        • 并不是说它超级重要,但是根据 OP 的示例,num 列上的数字后缀应该从 1 开始。
        • @ddejohn 是的,你是对的。只是想知道我是否应该通过这种差异进一步使代码复杂化。
        • 可能不值得努力:D
        • 没有必要。 0处的索引也很好。所有答案都很棒(并且相似),所以我选择了谁是第一个。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2021-05-10
        • 1970-01-01
        • 2022-10-07
        相关资源
        最近更新 更多