【问题标题】:Merge multiple column values into one column in python pandas在python pandas中将多个列值合并为一列
【发布时间】:2016-01-10 22:49:21
【问题描述】:

我有一个这样的熊猫数据框:

   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 的新数据框。此 columnA 应包含列 2 -(to) n 中的所有值(其中 n 是从 Column2 到行尾的列数),如下所示:

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

我怎样才能最好地解决这个问题?任何意见将是有益的。提前致谢!

【问题讨论】:

    标签: python list pandas row dataframe


    【解决方案1】:

    您可以调用applyaxis=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,这样我们就不会以浮点数作为str。

    【讨论】:

    • 出于某种原因,这对我不起作用。我得到重复。因此第 0 行 columnA 为 1,2,3,4,1,2,3,4
    • 似乎使用 iloc 对我有用。没有重复。 df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply( lambda x: ",".join(x.astype(str)), axis=1)
    • 试图在数据帧的切片副本上设置一个值。尝试改用 .loc[row_indexer,col_indexer] = value
    【解决方案2】:

    我建议使用.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))
    

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

    【讨论】:

    • 另外,如果你要处理大量数据,它比 lambda 快得多
    【解决方案3】:

    如果您有很多列,比如数据框中有 1000 列,并且您想基于 particular column name 合并少数列,例如-Column2 有问题和任意编号。该列之后的列数(例如,这里是'Column2 之后的 3 列,包括Column2,按照 OP 的要求)。

    我们可以使用.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()

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多