Digamos que eu tenha o seguinte dataframe:
Qual é a maneira mais eficiente de atualizar os valores das colunas feat e another_feat onde o stream é o número 2 ?
É isso?
for index, row in df.iterrows():
if df1.loc[index,'stream'] == 2:
# do something
ATUALIZAÇÃO: O que fazer se eu tiver mais de 100 colunas? Não quero nomear explicitamente as colunas que desejo atualizar. Quero dividir o valor de cada coluna por 2 (exceto para a coluna do fluxo).
Portanto, para deixar claro qual é o meu objetivo:
Dividindo todos os valores por 2 de todas as linhas que têm o fluxo 2, mas não alterando a coluna do fluxo
100
colunas de alguma forma. por exemplo, se precisar das100
primeiras colunas, usedf.columns[:100]
e depois passe paraloc
.Você pode fazer o mesmo com
.ix
este:In [1]: df = pd.DataFrame(np.random.randn(5,4), columns=list('abcd')) In [2]: df Out[2]: a b c d 0 -0.323772 0.839542 0.173414 -1.341793 1 -1.001287 0.676910 0.465536 0.229544 2 0.963484 -0.905302 -0.435821 1.934512 3 0.266113 -0.034305 -0.110272 -0.720599 4 -0.522134 -0.913792 1.862832 0.314315 In [3]: df.ix[df.a>0, ['b','c']] = 0 In [4]: df Out[4]: a b c d 0 -0.323772 0.839542 0.173414 -1.341793 1 -1.001287 0.676910 0.465536 0.229544 2 0.963484 0.000000 0.000000 1.934512 3 0.266113 0.000000 0.000000 -0.720599 4 -0.522134 -0.913792 1.862832 0.314315
EDITAR
Após as informações extras, o seguinte retornará todas as colunas - onde alguma condição for atendida - com valores reduzidos à metade:
>> condition = df.a > 0 >> df[condition][[i for i in df.columns.values if i not in ['a']]].apply(lambda x: x/2)
Eu espero que isso ajude!
fonte
condition = (df.a == -1.001287)
esperando que os valores fossem divididos da linha onde,a == -1.001287
mas obtive um dataframe vazio.df.iloc[1,0]
. Ou melhor ainda, defina o valor você mesmo e tente novamente:df.iloc[1,0] = 1.2345; condition = df.a == 1.2345
condition = (df.a == -1.001287)
não funciona?ix
agora está obsoleto.