如何基于列的子集中的值的存在,按行创建pandas DataFrame列?

时间:2017-04-18 19:59:34

标签: python pandas dataframe

我有一个pandas DataFrame如下:

import pandas as pd
data1 = {"column1": ["A", "B", "C", "D", "E", "F", "G"],
         "column2": [338, 519, 871, 1731, 2693, 2963, 3379],
         "column3": [5, 1, 8, 3, 731, 189, 9], 
         "columnA" : [5, 0, 75, 150, 0, 0, 0], 
         "columnB" : [0, 32, 0, 96, 0, 51, 0], 
         "columnC" : [0, 42, 0, 42, 0, 42, 42]}

df = pd.DataFrame(data1)

df
>>>     column1   column2   column3   columnA   columnB   columnC
0         A       338         5         5         0         0
1         B       519         1         0        32        42
2         C       871         8        75         0         0
3         D      1731         3       150        96        42
4         E      2693       731         0         0         0
5         F      2963       189         0        51        42
6         G      3379         9         0         0        42

columnAcolumnBcolumnC中的值可以是整数也可以是零。我想检查columnAcolumnBcolumnC中的值,以便columnC中有一个整数,columnA列和{{{ 1}}。

如果columnB中的值为columnCcolumnA中的零,我希望1位于新列columnB中。否则,newcolumn中的值应为0.

结果数据框应为:

newcolumn

我知道如何按列检查值(例如使用>>> column1 column2 column3 columnA columnB columnC newcolumn 0 A 338 5 5 0 0 0 1 B 519 1 0 32 42 0 2 C 871 8 75 0 0 0 3 D 1731 3 150 96 42 0 4 E 2693 731 0 0 0 0 5 F 2963 189 0 51 42 0 6 G 3379 9 0 0 42 1 .... ..... ........... )并且创建新列非常简单。但是,如何“按行”检查?

4 个答案:

答案 0 :(得分:2)

您可以在多个条件下使用boolean &运算符,如下所示

df['new column'] = (df['columnA'] == 0) & (df['columnB'] == 0) & (df['columnC'] != 0)
df['new column'] = df['new column'].astype(int)
df

结果

 column1  column2  column3  columnA  columnB  columnC  new column
0       A      338        5        5        0        0           0
1       B      519        1        0       32       42           0
2       C      871        8       75        0        0           0
3       D     1731        3      150       96       42           0
4       E     2693      731        0        0        0           0
5       F     2963      189        0       51       42           0
6       G     3379        9        0        0       42           1

答案 1 :(得分:2)

您可以使用np.where

df['newcolumn'] = np.where((df.columnA ==0) & (df.columnB == 0) & (df.columnC!= 0), 1, 0)


    column1 column2 column3 columnA columnB columnC newcolumn
0   A       338     5       5       0       0       0
1   B       519     1       0       32      42      0
2   C       871     8       75      0       0       0
3   D       1731    3       150     96      42      0
4   E       2693    731     0       0       0       0
5   F       2963    189     0       51      42      0
6   G       3379    9       0       0       42      1

答案 2 :(得分:2)

您可以使用DataFrame.eval方法:

In [146]: df['newcolumn'] = df.eval("columnA == 0 and columnB == 0 and columnC != 0") \
                              .astype(np.uint8)

In [147]: df
Out[147]:
  column1  column2  column3  columnA  columnB  columnC  newcolumn
0       A      338        5        5        0        0          0
1       B      519        1        0       32       42          0
2       C      871        8       75        0        0          0
3       D     1731        3      150       96       42          0
4       E     2693      731        0        0        0          0
5       F     2963      189        0       51       42          0
6       G     3379        9        0        0       42          1

答案 3 :(得分:2)

# clever regex... might even make good screen name
# might want to use this instead
# v = df.reindex_axis(['columnA', 'columnB', 'columnC'], 1)).values == 0
v = df.filter(regex='[A-Za-z]$').values == 0
v[:, -1] = ~v[:, -1]  # negate the last column
df.assign(New=v.all(1).astype(np.uint8))

  column1  column2  column3  columnA  columnB  columnC  New
0       A      338        5        5        0        0    0
1       B      519        1        0       32       42    0
2       C      871        8       75        0        0    0
3       D     1731        3      150       96       42    0
4       E     2693      731        0        0        0    0
5       F     2963      189        0       51       42    0
6       G     3379        9        0        0       42    1

它也很快

时间测试

enter image description here