Что такое 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?
Ответы на следующее не помогли:
Другой возможный способ может быть использование 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
Это не сработает, потому что 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)