2015-07-29 2 views
4

Есть ли способ (более эффективный, чем использование цикла for), чтобы заменить все нули в DataFrame Pandas с максимальным значением в соответствующей строке.Заменить нули в DataFrame с максимальным значением в строке

+0

Что вы подразумеваете под "более эффективным"? Сложность времени, которую вы пытаетесь сделать, не может быть улучшена из базовой реализации (цикл через каждую строку, вычислять максимальный, заполнять нули с max), так как вам нужно смотреть на каждый элемент хотя бы один раз. – James

+1

Как правило, с помощью Pandas вы можете выполнять операции с полным кадром сразу с помощью встроенных оптимизированных функций, которые быстрее, чем цикл через кадр самостоятельно. Например, df.mul (df2) быстрее, чем цикл через кадры одновременно и выполняет умножение в python. Подобно тому, как работает numpy. – rhaskett

ответ

2

Я думаю, что это то, что вы ищете:

import pandas as pd 

df = pd.DataFrame({'a': [1, 2, 0], 'b': [3, 0, 10], 'c':[0, 5, 34]}) 


    a b c 
0 1 3 0 
1 2 0 5 
2 0 10 34 

Вы можете использовать apply, перебрать все строки и заменить 0 на максимальном числе строки с помощью функции replace, которая дает вам ожидаемую выход:

df.apply(lambda row: row.replace(0, max(row)), axis=1) 

    a b c 
0 1 3 3 
1 2 5 5 
2 34 10 34 

Если вы хотите, чтобы заменить NaN - который, казалось, фактическая цель в соответствии с вашим комментарием - you can use

df = pd.DataFrame({'a': [1, 2, np.nan], 'b': [3, np.nan, 10], 'c':[np.nan, 5, 34]}) 

    a  b  c 
0 1.0 3.0 NaN 
1 2.0 NaN 5.0 
2 NaN 10.0 34.0 

df.T.fillna(df.max(axis=1)).T 

получая

 a  b  c 
0 1.0 3.0 3.0 
1 2.0 5.0 5.0 
2 34.0 10.0 34.0 

, которые могут быть более эффективными, чем

df.apply(lambda row: row.fillna(row.max()), axis=1) 

Пожалуйста, обратите внимание, что

df.apply(lambda row: row.fillna(max(row)), axis=1) 

не работает в каждом конкретном случае, как описано here.

+1

df.apply (ряд лямбда: row.fillna (макс (ряд)), ось = 1) сделал трюк. Благодарю. – rhaskett

+1

@ rhaskett: Прошло некоторое время, но, пожалуйста, посмотрите мое обновление. – Cleb

+1

интересный. К счастью, этот код давно ушел, но это могло быть неприятной ошибкой. – rhaskett

Смежные вопросы