У меня есть пример набора данных:
import pandas as pd
import numpy as np
d = {
'ID': ['A','B','C','D','E'],
'index_1':[2,0,2,-2,0],
'index_2':[-2,-2,0,0,0],
'index_3':[2,2,2,2,0],
'index_4':[2,2,0,-2,0],
'index_total':[2,2,2,2,2]
}
df = pd.DataFrame(d)
это выглядит так:
ID index_1 index_2 index_3 index_4 index_total
0 A 2 -2 2 2 2
1 B 0 -2 2 2 2
2 C 2 0 2 0 2
3 D -2 0 2 -2 2
4 E 0 0 0 0 2
я хочу создать столбец с именем 'flag' на основе следующих условий длякаждая строка :
- , если какой-либо из столбцов 'index_1', 'index_2', 'index_3', 'index_4' содержит значение -2 AND 'index_total'= 2, тогда flag = 1
- , если столбцы 'index_1', 'index_2', 'index_3', 'index_4' содержат только значение 0 AND 'index_total' = 2, тогда flag = 1
- else: flag = 0
желаемый вывод:
ID index_1 index_2 index_3 index_4 index_total flag
0 A 2 -2 2 2 2 1
1 B 0 -2 2 2 2 1
2 C 2 0 2 0 2 0
3 D -2 0 2 -2 2 1
4 E 0 0 0 0 2 1
мои попытки (заметьте, я использую циклы для index_1, index_2, index_3 иИмена столбцов index_4 вместо того, чтобы записывать их, потому что в моем фактическом наборе данных есть более 70 столбцов index_)
1-я попытка:
for colname in df.columns:
if "index_" in colname:
df[colname] = df[colname].astype(int)
#making sure the numbers are all integer for comparison
if ((df[colname] == -2).any() and df['index_total']==2):
df['flag'] = 1
#this doesn't work , it's going by columns not rows
2-я попытка:
for index, row in df.iterrows():
for colname in df.columns:
if "index_" in colname:
if( (df[colname][index] == -2).any() and df['index_total']==2 ):
df['flag'] = 1
# i stopped writing the other conditions because this one doesn't work