Python:将多个二进制列转换为单个分类列

时间:2018-04-24 18:19:18

标签: python pandas binary categorical-data

我有一个包含170列的csv文件数据集,前5列包含唯一标识符(平台,ID,日期,调用长度,名称)。其余列175包含涵盖10个类别的二进制数据。我想压缩这些列,以便我的数据框中的列数为15.包括下面的示例:

import pandas as pd

df1 = pd.DataFrame({'Platform': ['Telephone', 'Chat', 'Text'], 'ID': [1, 2, 
3], 'Length': [1545,1532,1511], 'Name': ['andy', 'helen', 'peter'], 'Problem: 
A':[0,1,0], 'Problem: B':[1,0,0], 'Problem: C': [0,0,1], 'Solution: A': 
[0,1,0], 'Solution: B':[1,0,0], 'Solution: C': [0,0,1]})

输出结果为:

df.head()

ID  Date        Length\\
1   2015-10-16    1545
2   2015-10-09    1532
3   2015-10-13    1511 

Name Problem: A Problem: B  Problem: C  Solution: A Solution: B Solution: C
andy         0          1           0            0           1           0
helen        1          0           0            1           0           0
peter        0          0           1            0           0           1

我希望数据框看起来像什么:

  Platform ID Length  Name   Problem  Solution
  Telephone 1 1545    andy    B        B
  Chat      2 1532    helen   A        A
  Text      3 1511    peter   C        C

仅供参考,这不是完整的数据框架。我想将总共170个列转换为15个。

2 个答案:

答案 0 :(得分:1)

您可以在列上使用带有点积的groupby + apply;

df = df.set_index('Name')
df.groupby(df.columns.str.split(':').str[0], axis=1).apply(
    lambda x: x.dot(x.columns.str.split(': ').str[1])
)

      Problem Solution
Name                  
andy        B        B
helen       A        A
peter       C        C

答案 1 :(得分:0)

我创建了这个自定义函数,可以满足您的目的。我从这个stackoverflow article

中得到了这个主意
def condenseCols(data,finalCol,*cols):
    cols = list(cols)
    x = data[cols] # Slice the cols
    x = x.idxmax(axis=1) 
    # x is now a series, holding column name of the max value in the row i.e one of the column from cols
    x = x.apply(lambda s : s.split(": ")[1]) # extract only the prefix (A,B,C)

    data[finalCol] = x
    data = data.drop(cols, axis=1, inplace=True) # Drop the columns : cols
    return data

通过传递要冷凝的列名称以及列的最终名称来调用此方法

condenseCols(df1,'Problem','Problem: A','Problem: B','Problem: C')
condenseCols(df1,'Solution','Solution: A','Solution: B','Solution: C')

stackoverflow article

文章中还提到了其他方法。