使用基于布尔过滤的pd.get_dummies创建新列

时间:2017-05-12 15:26:30

标签: pandas

我有这个数据框df2

    date     kind   sector
0   2017-02-01  P   A
1   2017-02-01  P   A
2   2017-02-01  L   A
3   2017-02-01  G   A
4   2017-02-01  P   B
5   2017-02-01  P   B
6   2017-02-01  L   B
7   2017-02-01  T   B
8   2017-02-02  P   A
9   2017-02-02  P   A
10  2017-02-02  L   A
11  2017-02-02  T   A
12  2017-02-02  A   B
13  2017-02-02  P   B
14  2017-02-02  L   B
15  2017-02-02  L   B

我正在尝试使用pd.dummies创建两个新列,OpenClose,这些列将基于kind值。如果kind = P,那么Close值将为1;对于所有其他值,“关闭”值将为“0”。另一方面,'开放'将是相反的;对于'P'之外的所有值,open的值为1.

所以我正在寻找这样的输出:

 date         kindSectClose Open
0   2017-02-01  P   A   1   0
1   2017-02-01  P   A   1   0
2   2017-02-01  L   A   0   1
3   2017-02-01  G   A   0   1
4   2017-02-01  P   B   1   0
5   2017-02-01  P   B   1   0
6   2017-02-01  L   B   0   1
7   2017-02-01  T   B   0   1
8   2017-02-02  P   A   1   0
9   2017-02-02  P   A   1   0
10  2017-02-02  L   A   0   1
11  2017-02-02  T   A   0   1
12  2017-02-02  A   B   0   1
13  2017-02-02  P   B   1   0
14  2017-02-02  L   B   0   1
15  2017-02-02  L   B   0   1 

我正在尝试使用pd.dummies 在一行中执行此,但无法使其正常工作。

我正在尝试通过布尔过滤创建临时列,然后将该列用作pd_get_dummies的基础,这将创建两个新列;我要重命名。

pd.get_dummies(df2, column =[df2.kind.apply(lambda x: int(x=='P')).rename(columns ={0: 'Open', 1:'Close'})])

是否可以在一个班轮中完成此操作?

2 个答案:

答案 0 :(得分:1)

以下是否符合您的需求:

df2 = pd.concat([df2,pd.get_dummies(df2['kind'].apply(lambda x: 'P' if x=='P' else 'N')).rename(columns={'P':'Close','N':'Open'},inplace=False)],axis=1)

答案 1 :(得分:1)

这个怎么样?这是你想要的 ?

import pandas as pd
df = pd.DataFrame({
    'date': ['2017-02-01', '2017-03-01', '2017-04-01' ,'2017-05-01'],
    'kind': ['P','A','A','P']

})
df['Open'], df['Close'] =  (df['kind'] =='P' ).astype(int) , (df['kind'] !='P' ).astype(int)
print df

df
         date kind  Open  Close
0  2017-02-01    P     1      0
1  2017-03-01    A     0      1
2  2017-04-01    A     0      1
3  2017-05-01    P     1      0