【问题标题】:combine all columns in Dataframe (pandas) - python3 [duplicate]合并Dataframe(熊猫)中的所有列-python3 [重复]
【发布时间】:2023-04-10 14:22:01
【问题描述】:

我正在尝试将所有列中的所有数据合并为一列。像这样:

A B C                X
1 2 3               123
3 2 1      -->      321 
5 6 7               567

请记住,我们不知道列数和行数。

我尝试这样解决它,但它不起作用。

db.assign(sum = db.apply(''.join, axis = 1)).drop([db.index], axis = 1)

提前致谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这行得通吗?

    df.astype(str).sum(axis=1).astype(int)
    

    给定:

    df = pd.DataFrame({'A':[1,3,5],'B':[2,2,6],'C':[3,1,7]})
    

    结果:

       A  B  C    X
    0  1  2  3  123
    1  3  2  1  321
    2  5  6  7  567
    

    【讨论】:

    • 很酷的一个(已经赞成),但字符串连接很慢,这会为每个连接构建一个新字符串。对于大型 dfs 可能效率不高
    • @Chester 我同意!还有更有效的方法。
    • df.astype(str).agg(''.join, axis=1) 可能更快, sum 执行成对连接(因为字符串是不可变的)。
    【解决方案2】:

    我们可以使用np.geomspacedf.mul 然后df.sum

    c = df.shape[1]
    end = 10**(c-1)
    df['X'] = df.mul(np.geomspace(end, 1, num=c)).sum(1)
    
       A  B  C      X
    0  1  2  3  123.0
    1  3  2  1  321.0
    2  5  6  7  567.0
    

    时间分析:

    基准设置:

    vals = np.random.randint(2, 10, (100_000, 6))
    df = pd.DataFrame(vals)
    

    In [93]: %%timeit
        ...: df.astype(str).sum(axis=1).astype(int)
        ...: 
        ...: 
    419 ms ± 3.63 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [94]: %%timeit
        ...: c = df.shape[1]
        ...: end = 10**(c-1)
        ...: df.mul(np.geomspace(end, 1, num=c)).sum(1)
        ...: 
        ...: 
    8.02 ms ± 170 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

    • 在这里使用算术非常优雅,干得好!
    • 这是一个经过深思熟虑的技巧!
    猜你喜欢
    • 2015-07-02
    • 2019-12-15
    • 2017-11-14
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多