我有如下数据框(示例如下所示)
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。任何帮助都将不胜感激。
答案 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)
如果只需要0
和1
输出,我认为您需要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