【问题标题】:Combine columns in pandas to create a new column合并 pandas 中的列以创建新列
【发布时间】:2019-10-15 00:41:58
【问题描述】:

您好,我正在处理 pandas 数据框,我想创建一个组合多个列的列并对它们应用条件,我正在寻找一种聪明的方法来做到这一点。

假设数据框看起来像

A   B   C   D
1   0   0   0
0   1   0   0
0   0   1   0
1   0   1   0
1   1   1   0
0   0   1   1

我的输出列应该如下

A   B   C   D   Output_col
1   0   0   0   A
0   1   0   0   B
0   0   1   0   C
1   0   1   0   A_C
1   1   1   0   A_B_C
0   0   1   1   C_D

我当然可以使用下面的代码来实现这一点,但是我必须为每一列都这样做。

test['Output_col'] = test.A.apply(lambda x: A if x > 0 else 0)

我想知道如果我有非常多的列,是否有一种方法可以在不应用到每一列的情况下实现这一点。

提前致谢!!

【问题讨论】:

    标签: python-3.x pandas dataframe feature-engineering


    【解决方案1】:

    使用DataFrame.apply + join。 使用x.index( 注意使用axis = 1) + boolean indexing 和Series.eq 来过滤选定的列:

    test['Output_col']=test.apply(lambda x: '_'.join(x.index[x.eq(1)]),axis=1)
    print(test)
    

       A  B  C  D Output_col
    0  1  0  0  0          A
    1  0  1  0  0          B
    2  0  0  1  0          C
    3  1  0  1  0        A_C
    4  1  1  1  0      A_B_C
    5  0  0  1  1        C_D
    

    仅应用列列表:

    my_list_columns=['enter element of your list']
    test['Output_col']=test[my_list_columns].apply(lambda x: '_'.join(x.index[x.eq(1)]),axis=1)
    print(test)
    

    所有列的大小写为 0

    my_list_columns=['A','B','C','D']
    df['Output_col']=df[my_list_columns].apply(lambda x: '_'.join(x.index[x.eq(1)])  if x.eq(1).any() else 'no_value',axis=1)
    print(df)
    
       A  B  C  D Output_col
    0  1  0  0  0          A
    1  0  0  0  0   no_value
    2  0  0  1  0          C
    3  1  0  1  0        A_C
    4  1  0  1  0        A_C
    5  0  0  1  1        C_D
    

    【讨论】:

    • 非常感谢您的回复,但我只需要将其应用于列列表,但我相信这将应用于数据框中的所有列。任何方式我都可以只应用一个列列表。很抱歉造成混乱
    • 我已经针对这种情况更新了解决方案。不要忘记给答案评分:stackoverflow.com/help/someone-answers。对网站运营很有用
    • 感谢这正是我一直在寻找的,它确实具有魔力,但是对于所有列为零的所有行,它似乎生成了我尝试使用 test['Output_col'] = test['Output_col'].str.replace(" ", 'no_value') 修复的空白单元格.但这似乎没有帮助。任何方法都可以解决这个问题
    • 为什么会有空格?如果test ['out_col'] = test['out_col'] str.replace (" "," no_value ") 不起作用,那是因为没有空格。可能是因为数据的合理性
    • 很高兴为您提供帮助!
    【解决方案2】:

    编辑:对于列的子集(我使用方法 2)

    cols = ['A', 'B']
    df1 = df[cols]
    s = df1.columns + '-'
    df['Output_col'] = df1.dot(s).str[:-1]
    
    Out[54]:
       A  B  C  D Output_col
    0  1  0  0  0          A
    1  0  1  0  0          B
    2  0  0  1  0
    3  1  0  1  0          A
    4  1  1  1  0        A-B
    5  0  0  1  1
    

    试试str.replace和dot的组合

    df['Output_col'] = df.dot(df.columns).str.replace(r'(?<!^)(?!$)','-')
    
    Out[32]:
       A  B  C  D Output_col
    0  1  0  0  0          A
    1  0  1  0  0          B
    2  0  0  1  0          C
    3  1  0  1  0        A-C
    4  1  1  1  0      A-B-C
    5  0  0  1  1        C-D
    

    如果您对正则表达式模式感到不安。不用str.replace也可以试试这个方法

    s = df.columns + '-'
    df['Output_col'] = df.dot(s).str[:-1]
    
    Out[50]:
       A  B  C  D Output_col
    0  1  0  0  0          A
    1  0  1  0  0          B
    2  0  0  1  0          C
    3  1  0  1  0        A-C
    4  1  1  1  0      A-B-C
    5  0  0  1  1        C-D
    

    【讨论】:

    • 嘿,安迪。,感谢您的回复,但不适用于列列表,这将再次应用于整个数据集
    • @AnalyticsTeam:哦,在这种情况下,只需对您想要的列列表进行切片,然后处理该切片数据帧并分配回df。我编辑了答案以显示它
    【解决方案3】:

    这建立在@Jezrael 提供的解决方案之上:link

    df['Output_col'] = df.dot(df.columns.str.cat(['_']*len(df.columns),sep='')).str.strip('_')
    
    
    
        A   B   C   D   Output_col
    0   1   0   0   0   A
    1   0   1   0   0   B
    2   0   0   1   0   C
    3   1   0   1   0   A_C
    4   1   1   1   0   A_B_C
    5   0   0   1   1   C_D
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 2021-10-09
      • 2021-04-14
      • 2016-12-25
      • 2017-05-06
      • 1970-01-01
      • 2019-08-12
      • 2019-07-19
      相关资源
      最近更新 更多