J'ai travaillé sur un algorithme qui sépare les lignes d'une trame de données en fonction de l'une des colonnes pour les traiter différemment. Les résultats doivent être remontés par la suite. Je dois m'assurer que l'index est conservé et dans le même ordre.

Au départ, je pensais pouvoir simplement concaténer les résultats, puis mettre l'index dans le même ordre. Cependant, je ne peux pas trouver un moyen efficace de le faire. Le mieux que j'ai pu trouver c'est ça :

import pandas as pd

# Input data with non-ordered index.
input_data = pd.DataFrame({
    'type': ['a', 'a', 'b', 'c', 'a'],
    'value': [1, 2, 3, 4, 5],
}, index=[0, 10, 40, 30, 20])
# input_data:
#    type  value
# 0     a      1
# 10    a      2
# 40    b      3
# 30    c      4
# 20    a      5

# Data separated into two and treated differently.
data_a = input_data[input_data['type'] == 'a']
data_a['result'] = data_a['value'].mean()
data_b = input_data[input_data['type'] != 'a'] 
data_b['result'] = data_b['value'].max()

# Assemble output.
output_data = (
    pd.DataFrame(index=input_data.index) # correct index order
    .merge(
        pd.concat(
            [data_a['result'], data_b['result']], axis=0
        ), # wrong index order
        how='left', left_index=True, right_index=True # 'left' preserves order
    )
)
# output_data:
#       result
# 0   2.666667
# 10  2.666667
# 40  4.000000
# 30  4.000000
# 20  2.666667

Existe-t-il un moyen plus simple de procéder? Ou peut-être plus efficace ?

0
Nicio 12 oct. 2020 à 13:47

1 réponse

Meilleure réponse

Utilisez DataFrame.reindex si les valeurs d'index sont uniques :

output_data  = pd.concat([data_a['result'], data_b['result']]).reindex(input_data.index)
1
jezrael 12 oct. 2020 à 10:49