在python panda中将多个列值合并为一列

zvms9eto  于 2022-12-21  发布在  Python
关注(0)|答案(4)|浏览(258)

我有一个Pandas的数据框,像这样:

Column1  Column2  Column3  Column4  Column5
 0    a        1        2        3        4
 1    a        3        4        5
 2    b        6        7        8
 3    c        7        7

我现在要做的是获取一个包含Column1和一个新columnA的新 Dataframe 。这个columnA应该包含从列2到列n(其中n是从列2到行末的列数)的所有值,如下所示:

Column1  ColumnA
0   a      1,2,3,4
1   a      3,4,5
2   b      6,7,8
3   c      7,7

我怎样才能最好地处理这个问题?

bfnvny8b

bfnvny8b1#

您可以调用apply,将axis=1按行传递到apply,然后将dtype转换为strjoin

In [153]:
df['ColumnA'] = df[df.columns[1:]].apply(
    lambda x: ','.join(x.dropna().astype(str)),
    axis=1
)
df

Out[153]:
  Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7

这里我调用dropna来去掉NaN,但是我们需要再次强制转换为int,这样我们就不会把float作为str。

mfuanj7w

mfuanj7w2#

我建议使用.assign

df2 = df.assign(ColumnA = df.Column2.astype(str) + ', ' + \
  df.Column3.astype(str) + ', ' df.Column4.astype(str) + ', ' \
  df.Column4.astype(str) + ', ' df.Column5.astype(str))

它很简单,也许很长,但对我很有效

7uzetpgm

7uzetpgm3#

如果您有很多列,比如说 Dataframe 中有1000列,并且您希望基于particular column name合并几列,例如,正在讨论的-Column2和该列之后的任意列数(例如,这里是'Column2之后的3列,包括OP要求的Column2)。
我们可以使用.get_loc()得到列的位置-答案为here

source_col_loc = df.columns.get_loc('Column2') # column position starts from 0

df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply(
    lambda x: ",".join(x.astype(str)), axis=1)

df

Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7

要删除NaN,请使用.dropna().fillna()
希望能有所帮助!

gev0vcfq

gev0vcfq4#

apply()比agg()慢100倍

不要使用apply,因为它的伸缩性不好。请改用df.agg()。使用apply()将花费几秒钟,但agg()将花费几毫秒(ms)。

下面是一个例子:

import numpy as np
import pandas as pd

def createList(r1, r2):
    return np.arange(r1, r2+1, 1)

sample_data = createList(1, 100_000) # a list of 100,000 values

test_df = pd.DataFrame(
    [sample_data]
)

test_df.apply(lambda x: ','.join(x.astype(str))) #3.47 s ± 24.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

test_df.astype(str).agg(', '.join, axis=1) #34.8 ms ± 407 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

从这个示例中可以看到,apply()平均花费了3.47秒,而agg()平均花费了34.8毫秒,随着数据的增加,性能上差距会越来越大。

  • 注意,我使用jupyter notebook中的%%timeit来获取每个方法的运行时间。

相关问题