伪变量python上的数据操作

时间:2017-01-31 07:18:41

标签: python pandas

我有如下数据框(示例如下所示)

Date       event  A B C D
2015-10-01  A     1 0 0 0
2015-10-02  A|B   1 1 0 0
2015-11-01  C     0 0 1 0 
2015-10-07  D     0 0 0 1

这里A表示仅发生事件A,A | B表示特定日期发生A和B.现在我已经为事件形成了虚拟变量,如上所示。随后我想将B,C和D分成一个叫做“未成年人”的活动。所以我的输出看起来像:

Date       event  A  Minor
2015-10-01  A     1   0
2015-10-02  A|B   1   1
2015-11-01  C     0   1
2015-10-07  D     0   1

正如您所看到的第二行,Minor等于1,因为B也在当天发生。我很困惑如何处理这个问题。实际上我有20多个列需要分组为minor。任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用assign + drop

cols = list('BCD')
df.assign(Minor=df[cols].sum(1)).drop(cols, 1)

        Date event  A  Minor
0 2015-10-01     A  1      0
1 2015-10-02   A|B  1      1
2 2015-11-01     C  0      1
3 2015-10-07     D  0      1

答案 1 :(得分:1)

如果只需要01输出,我认为您需要DataFrame.max

cols = ['B','C','D']

df['Minor'] = df[cols].max(axis=1)
df = df.drop(cols, axis=1)
print (df)
         Date event  A  Minor
0  2015-10-01     A  1      0
1  2015-10-02   A|B  1      1
2  2015-11-01     C  0      1
3  2015-10-07     D  0      1

或者如果需要和值使用DataFrame.sum

df['Minor'] = df[cols].sum(axis=1)
df = df.drop(cols, axis=1)
print (df)
         Date event  A  Minor
0  2015-10-01     A  1      0
1  2015-10-02   A|B  1      1
2  2015-11-01     C  0      1
3  2015-10-07     D  0      1

已更改df的差异:

print (df)
         Date event  A  B  C  D
0  2015-10-01     A  1  0  0  0
1  2015-10-02   A|B  1  1  0  0
2  2015-11-01   C|D  0  0  1  1
3  2015-10-07     D  0  0  0  1

cols = ['B','C','D']

df['Minor'] = df[cols].sum(axis=1)
df = df.drop(cols, axis=1)
print (df)
         Date event  A  Minor
0  2015-10-01     A  1      0
1  2015-10-02   A|B  1      1
2  2015-11-01   C|D  0      2
3  2015-10-07     D  0      1

df['Minor'] = df[cols].max(axis=1)
df = df.drop(cols, axis=1)
print (df)
         Date event  A  Minor
0  2015-10-01     A  1      0
1  2015-10-02   A|B  1      1
2  2015-11-01   C|D  0      1
3  2015-10-07     D  0      1