Замена всех отрицательных значений в определенных столбцах другим значением - PullRequest
0 голосов
/ 03 мая 2018

Предположим, у меня есть четыре последовательно расположенных столбца как часть фрейма данных, и я хочу заменить все отрицательные значения в этих 4 столбцах другим значением (скажем, -5), как мне это сделать?

T1   T2  T3  T4
20   -5  4   3
85  -78  34  21
-45  22  31  75
-6   5   7  -28

Логично, я надеялся, что это сработает. Но это не так.

for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
    for j in df[i]:
        if j<0:
            j=-5

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы можете использовать индексирование:

c = ['T1','T2','T3','T4']
df[df[c] < 0] = -5

Или clip:

In [47]: df[c].clip(lower=-5)
Out[47]:
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5
0 голосов
/ 03 мая 2018

Вы можете просто использовать indexing, применив оператор условия.

cols = ['T1','T2','T3','T4']
df[df[cols] < 0] = -5

Выход

In [35]: df
Out[35]:
     T1  T2  T3  T4
  0  20  -5   4   3
  1  85  -5  34  21
  2  -5  22  31  75
  3  -5   5   7  -5

В вашем примере вы просто заменяете значение переменной. Вам необходимо заменить значение одной ячейки, используя метод at.

for i in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4]<0:
for index, j in enumerate(df[i]):
    if j<0:
        df.at[index, i] = -5
0 голосов
/ 03 мая 2018

Использовать mask - для всех столбцов:

df = df.mask(df < 0, -5)

Или, если необходимо, указать столбцы:

cols = ['T1','T2','T3','T4']
df[cols] = df[cols].mask(df[cols] < 0, -5)
print (df)
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5

С аналогичным подходом с выбором по позициям, как в вопросе:

pos = df.columns.get_loc("T1")
df.iloc[:,pos:pos+4] = df.iloc[:,pos:pos+4].mask(df < 0, -5)

EDIT:

Циклические решения в пандах не рекомендуются, если существует векторизованное решение , потому что медленное.

Но возможно, ваш код должен быть изменен с iterrows и iteritems:

for i, row in df.iloc[:,df.columns.get_loc("T1"):df.columns.get_loc("T1")+4].iterrows():
    for j,k in row.iteritems():
        if k < 0:
            df.loc[i, j] = -5
print (df)
   T1  T2  T3  T4
0  20  -5   4   3
1  85  -5  34  21
2  -5  22  31  75
3  -5   5   7  -5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...