【问题标题】:Combine lists in Pandas column where column name is in list合并 Pandas 列中的列表,其中列名在列表中
【发布时间】:2018-06-30 04:03:15
【问题描述】:

我有三个Pandas 列,其中元素是list。为了组合这些列表,我可以通过将列的名称和+ 明确写在一起来完成

df = pd.DataFrame({'allmz':([[1,2,3],[2,4,5],[2,5,5],[2,3,5],[1,4,5]]),'allint':([[11,31,31],[21,41,51],[41,51,51],[11,31,51],[1,51,11]]), 'allx':([[6,7,3],[2,4,5],[2,5,5],[2,9,5],[3,4,5]])})
df['new'] = df['allmz'] + df['allint'] + df['allint']
print df

      allint      allmz       allx                                new
0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 11, 31, 31]
1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 21, 41, 51]
2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 41, 51, 51]
3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 11, 31, 51]
4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]    [1, 4, 5, 1, 51, 11, 1, 51, 11]

但是,如果我有太多列名来编写每个列名,有没有办法通过循环(或不循环)列名列表来做到这一点: 改为columns = ['allmz','allint','allx']

【问题讨论】:

    标签: python python-2.7 list pandas


    【解决方案1】:

    选项 1
    在列上切片并沿第一轴调用sum

    df['new'] = df[['allmz','allint','allx']].sum(axis=1)
    

    df
             allint      allmz       allx                             new
    0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 6, 7, 3]
    1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 2, 4, 5]
    2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 2, 5, 5]
    3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 2, 9, 5]
    4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]   [1, 4, 5, 1, 51, 11, 3, 4, 5]
    

    选项 2
    np.concatenate 的另一个选项:

    v = df[['allmz','allint','allx']].values.tolist()
    df['new'] = np.concatenate(v, axis=0).reshape(len(df), -1).tolist()
    

    df
    
             allint      allmz       allx                             new
    0  [11, 31, 31]  [1, 2, 3]  [6, 7, 3]  [1, 2, 3, 11, 31, 31, 6, 7, 3]
    1  [21, 41, 51]  [2, 4, 5]  [2, 4, 5]  [2, 4, 5, 21, 41, 51, 2, 4, 5]
    2  [41, 51, 51]  [2, 5, 5]  [2, 5, 5]  [2, 5, 5, 41, 51, 51, 2, 5, 5]
    3  [11, 31, 51]  [2, 3, 5]  [2, 9, 5]  [2, 3, 5, 11, 31, 51, 2, 9, 5]
    4   [1, 51, 11]  [1, 4, 5]  [3, 4, 5]   [1, 4, 5, 1, 51, 11, 3, 4, 5]
    

    【讨论】:

    • 比我的好。
    • @Alex 谢谢你,但你不必删除 :-)
    • 是的@Alex我只是想说我从你的代码中得到错误`TypeError:只能连接列表(而不是“unicode”)。它让我发现了我的玩具和真实数据之间的区别
    • 未删除... @Jan 这些列表真的是字符串吗?对我来说很好。
    • @Jan 抱歉,但这超出了您原始问题的范围,此答案适用于提供的数据。现在,将字符串转换为列表是另一回事,我会给你这个链接:stackoverflow.com/questions/48008191/…
    【解决方案2】:

    您可以使用 Python 的内置 sum 函数。

    df['new'] = sum([df[col] for col in df], [])
    

    【讨论】:

      【解决方案3】:

      如果您有大量列名,那么解决此问题的简单方法如下所示:

      col = df.loc[: , "allint":"allx"]
      

      其中“allint”是开始列名,“allx”是结束列名

      df['new'] = col.sum(axis=1)
      df
      

      这将为您提供与写入每列名称后相同的结果。

      【讨论】:

        猜你喜欢
        • 2014-06-23
        • 2017-06-20
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2021-02-21
        相关资源
        最近更新 更多