-1
votes

Fonction Python qui itère à travers des listes correspondantes des colonnes Pandas

J'ai un grand nombre de colonnes correspondantes: cola1, cola2 ... cola60 et colb1, colb2 ... Colb60. Sur la base des valeurs de COLA1 et de COLB1, je voudrais créer COLC1. Comment créer une fonction qui itère à travers I dans la plage 1 à 3 pour Colai, Colbi et Colci? En réalité, la gamme est beaucoup plus grande.

J'ai réussi à créer une liste de noms de colonnes: p> xxx pré>

quelques données d'échantillon: p> xxx pré>

Comment Puis-je parcourir ces colonnes correspondantes dans une fonction? Voici ma tentative qui ne fonctionne pas du tout. P>

def test_fx(x):  
    for a in range(len(A_list)) and b in range(len(B_list)):
        c == df[a]
        if df[b] >= 10:
            c = df[a]*2
        elif [b] >= 20:
            c = df[a]*3
        elif [b] >= 30:
            c = df[a]*4
        return c

for c in range(len(C_list)):
    df[c] = 'empty'
    df[c].apply(test_fx)


1 commentaires

Publier quelques lignes de vos données et sortie souhaitée


3 Réponses :


1
votes

Autant que je puisse lire, vous souhaitez parcourir toutes les colonnes en même temps, vous pouvez utiliser ITERROSS:

for index, row in df.iterrows():
    print(row['colA1'], row['colA2'])


0 commentaires

2
votes

Le problème que je peux voir dans les lignes que vous avez postées est avec votre demande. Vous ne spécifiez jamais les colonnes de votre DF que vous souhaitez appliquer la fonction test_fx sur.

La syntaxe de base Si vous souhaitez créer une nouvelle colonne C à partir d'une colonne existante A dans un fichier de données est la suivante: p>

import numpy as np

# get your column names
range_list= list(range(1,4))
list_A = ['colA' + str(s) for s in range_list]
list_B = ['colB' + str(s) for s in range_list]
list_C = ['colC' + str(s) for s in range_list]

#your self-defined function
#note that it takes a tuple as input
def test_fx(l):
    a,b=l
    q= a
    if b >= 30:
        q=a*4
    elif b >= 20:
        q = a*3
    elif b >= 40:
        q = a*2
    else: 
        q=np.nan
    return q


#iterate over each couple of colAi, colBi and put the result in colCi
for i in range(0, len(range_list)):
    a = list_A[i] #next colA name
    b = list_B[i] #next colB name
    c = list_C[i] 
    df[c] = df[[a, b]].apply(test_fx, axis =1)

print(df)


3 commentaires

Dans cette sortie, COLC2 est manquant et COLC3 est peuplé avec "Aucun".


Vous avez raison. Je l'ai édité pour corriger le néant à une vraie Nan. Quand je l'exécute, je n'ai pas disparu Colc2. En outre, j'ai créé la fonction test_fx sur la première fonction que vous avez postée. Vous pouvez facilement modifier les valeurs à l'intérieur de la fonction, je l'ai créée afin qu'il ressemble de près votre cas d'utilisation. Je vais le modifier.


oops mauvaise copie-pâte d'un premier essai, la colonne C2 apparaît comme par magie



2
votes

Si vous voulez itérer via vos colonnes, vous pouvez essayer ceci: xxx pré>

avec cette méthode, je crée les colonnes CI une à la fois: Je sous-ensemble la colonne IA par les valeurs des colonnes BI (ici il y a 3 sous-ensembles pour les 3 cas de votre exemple), puis je concaténate le résultat en une seule série qui sera ma colonne CI. p>

la sortie de DF sera alors: p>

   colA1  colA2  colA3  colB1  colB2  colB3    C1     C2     C3
0      2     38     90      1     24     35   NaN  114.0  360.0
1      6      6     40     46      3     12  24.0    NaN   80.0
2      8     14     80     23      9     19  24.0    NaN  160.0
3     28     63     98      4     10      3   NaN  126.0    NaN
4      5      3      3     42     24     23  20.0    9.0    9.0


0 commentaires