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

1

Текущие данные:

Хранится в виде Pandas DataFrame

print(df)

col1 | col2 
A    | 1
B    | 3
C    | 3
D    | 7
E    | 4
C    | 3

Цель:

Я хочу создать новый столбец, который добавит 1 к col2, если col1 - либо A, C, либо E.

col1 | col2  | col2_corrected
A    | 1     | 2
B    | 3     | 3
C    | 3     | 4
D    | 7     | 7
E    | 4     | 5
C    | 3     | 4

Мое неудачное решение:

add_one_to_me = ['A','C','E']

if df.col1.isin(add_one_to_me):
    df.col2_corrected = df.col2 + 1
else: df.col2_corrected = df.col2

Это порождает ошибку в двусмысленной истине, потому что она оценивает правду всей серии.

Как применить это к каждой строке DataFrame? Я новичок в Python и программировании, поэтому это довольно простой вопрос.

Заранее спасибо!

Теги:
pandas
loops
if-statement

3 ответа

3
Лучший ответ
# Copy the existing column over
df['col2_corrected'] = df.col2

# Increment the values of only those items where col1 is A C or E
df.loc[df.col1.isin(['A', 'C', 'E']), 'col2_corrected'] += 1

df
Out[]: 
  col1  col2  col2_corrected
0    A     1               2
1    B     3               3
2    C     3               4
3    D     7               7
4    E     4               5
5    C     3               4

Причина, по которой вы получаете эту ошибку, - это строка, if df.col1.isin(add_one_to_me):

Если мы посмотрим: df.col1.isin(add_one_to_me)

Out[]: 
0     True
1    False
2     True
3    False
4     True
5     True

И это не говорит о if инструкция if. То, что вы могли бы сделать, это итеративно проверять каждый элемент в col1 а затем увеличивать col2_corrected на один. Это можно сделать с помощью df.apply(...) или for index, row in df.iterrows():

  • 1
    В целях производительности я бы избегал iterrows и придерживался apply если вы идете по этому пути
2

Вы можете использовать тот факт, что целое значение True равно 1

df['col2_corrected'] = df['col2'] + df['col1'].isin(add_one_to_me)
0

Вы также можете использовать функциональные возможности map т.е.

df['new'] = df['col1'].map({'A':1,'C':1,'E':1}).fillna(0) + df['col2']

   col1  col2  new
0    A     1  2.0
1    B     3  3.0
2    C     3  4.0
3    D     7  7.0
4    E     4  5.0
5    C     3  4.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню