我有一个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
columnA
,columnB
和columnC
中的值可以是整数也可以是零。我想检查columnA
,columnB
和columnC
中的值,以便columnC
中有一个整数,columnA
列和{{{ 1}}。
如果columnB
中的值为columnC
和columnA
中的零,我希望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
.... ..... ...........
)并且创建新列非常简单。但是,如何“按行”检查?
答案 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
它也很快
时间测试