Пандейские рассуждения о способе условного обновления нового значения из других значений в той же строке в DataFrame

1

Что такое pandaic-рассуждение о способе обновления нового значения в DataFrame на основе других значений из той же строки?

Дано

df = pd.DataFrame([[1,2],[3,4]], columns=list('ab'))
   a  b  
0  1  2  
1  3  4  

я хочу

   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

Если значения в столбце 'c' установлены из 'a', если 'b'> = 4.

(1) Я попробовал:

df['c']=df[df['b']>=4]['a']
   a  b    c
0  1  2  NaN
1  3  4  3.0

который работал.

(2) Я также попытался Как можно условно обновить несколько столбцов в фреймворке panda, который устанавливает значения из других значений строк:

df.loc[df['b'] >= 4, 'c'] = df['a']
   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

который работал.

(3) jp также показал другой способ:

df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)
   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

который работал.

Какое из вышеперечисленных является самым pandic? Как работает loc?

Ответы на следующее не помогли:

Теги:
pandas
python-3.x

2 ответа

1
Лучший ответ

Другой возможный способ может быть использование apply:

df['c'] = df.apply(lambda row: row['a'] if row['b'] >=4 else None, axis=1)
print(df)

Результат:

   a  b    c
0  1  2  NaN
1  3  4  3.0

Сравнивая тайминги, np.where кажется, лучше всего работает среди разных методов:

%timeit df.loc[df['b'] >= 4, 'c'] = df['a']

1000 loops, best of 3: 1.54 ms per loop

%timeit df['c']=df[df['b']>=4]['a']

1000 loops, best of 3: 869 µs per loop

%timeit df['c'] = df.apply(lambda row: row['a'] if row['b'] >=4 else None, axis=1)

1000 loops, best of 3: 440 µs per loop

%timeit df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)

1000 loops, best of 3: 359 µs per loop

1

Это не сработает, потому что df['c'] не определен, и если бы это было так, то левый - это dataframe, а справа - серия:

df[df['b'] >= 4] = df['c']

Вы не можете назначить серию в кадр данных, и ваше назначение находится в неправильном направлении, поэтому это никогда не будет работать. Однако, как вы нашли, следующие работы:

df.loc[df['b'] >= 4, 'c'] = df['a']

Это связано с тем, что левая и правая части этого задания являются рядами. В качестве альтернативы вы можете использовать numpy.where, который вы можете найти более явным:

df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)
  • 0
    спасибо за быстрый ответ. упс. Я отправил неправильный код, когда присваиваю читающему 'c', а не игнорируем. исправляя выше.

Ещё вопросы

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