Python подсчет очков, проверка строк - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь добавить оценку «1» для каждого участника (представленного строкой), имеющего два значения атрибута (столбца), равного «Вкл.»

Однако, хотя ячейки содержат«Вкл.» Это не присваивает оценку 1.

Есть ли более простое решение?

for row in reduction.itertuples():
    if str(reduction['q1-1']) == "On" and str(reduction['q1-2']) == "On":
        q1 = 1
    else:
        q1 = 0
    print(q1)

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

q1 не имеет значения в вашем цикле.print также не обновляет фрейм данных.Если вы хотите использовать цикл, вам нужно будет использовать pd.DataFrame.loc, что-то вроде:

for row in df[['q1-1', 'q1-2']].itertuples():
    if (row[1] == 'On') and (row[2] == 'On'):
        df.loc[row.Index, 'Score'] = 1

Но это неэффективно, так как итерация каждой строки в цикле уровня Python,С Pandas вы должны стремиться к векторизованному решению:

mask = reduction[['q1-1', 'q-2']].astype(str).eq('On').all(1)
reduction['score'] = mask.astype(int)
0 голосов
/ 02 октября 2018

При необходимости новый столбец q создать логическую маску и привести к целым числам:

reduction = pd.DataFrame({
    'q1-1': ['On','On','Off','Off'],
    'q1-2': ['On','Off','On','Off']
})

mask = (reduction['q1-1'].astype(str) == "On") & (reduction['q1-2'].astype(str)  == "On")

#alternative
mask = (reduction[['q1-1','q1-2']].astype(str) == "On").all(axis=1)
reduction['q'] = mask.astype(int)
print (reduction)
  q1-1 q1-2  q
0   On   On  1
1   On  Off  0
2  Off   On  0
3  Off  Off  0

Объяснение альтернативы:

Привести столбцы, выбранные подмножеством, в строки и сравнить по DataFrame.eq ==:

print (reduction[['q1-1','q1-2']].astype(str) == "On")
    q1-1   q1-2
0   True   True
1   True  False
2  False   True
3  False  False

Затем проверьте, равны ли all значения True с для строк:

print ((reduction[['q1-1','q1-2']].astype(str) == "On").all(axis=1))
0     True
1    False
2    False
3    False
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...