web-dev-qa-db-fra.com

Itération sur les colonnes et les lignes dans Pandas Dataframe

Disons que j'ai un cadre de données qui ressemble à:

d = {'option1': ['1', '0', '1', '1'], 'option2': ['0', '0', '1', '0'], 'option3': ['1', '1', '0', '0'], 'views': ['6', '10', '5', '2']
df = pd.DataFrame(data=d)

print(df)

  option1 option2 option3 views
0       1       0       1     6
1       0       0       1    10
2       1       1       0     5
3       1       0       0     2

J'essaie de construire une boucle for qui itère sur chaque colonne (sauf la colonne "vues") et chaque ligne. Si la valeur d'une cellule n'est pas 0, je souhaite la remplacer par la valeur correspondante de la colonne "vues" de la même ligne.

La sortie suivante est requise (devrait être plus facile à comprendre):

  option1 option2 option3 views
0       6       0       6     6
1       0       0      10    10
2       5       5       0     5
3       2       0       0     2

J'ai essayé quelque chose comme:

df_range = len(df)

for column in df:
    for i in range(df_range):
        if column != 0:
            column = df.views[i]

Mais je sais que quelque chose me manque, ça ne marche pas.

Notez également que dans mon cadre de données réel, j'ai des dizaines de colonnes. J'ai donc besoin de quelque chose qui effectue une itération automatique sur chaque colonne. Merci!!

J'ai vu ce fil Mettre à jour une image dans des pandas en itérant ligne par ligne mais cela ne s'applique pas exactement à mon problème, car je ne vais pas seulement ligne par ligne, je dois également aller colonne par colonne. .

2
Notna

Vous pouvez également obtenir le résultat souhaité de cette façon:

for col in df:
    if col == 'views':
        continue
    for i, row_value in df[col].iteritems():
        df[col][i] = row_value * df['views'][i]

Notez ce qui suit à propos de cette solution:

1) Cette solution opère individuellement sur chaque valeur de la trame de données et est donc moins efficace que la diffusion, car elle effectue deux boucles (une externe et une interne).

2) Cette solution suppose que option1... option N est binaire, car cette solution multiplie chaque valeur binaire dans option1... option N avec les valeurs dans views.

3) Cette solution fonctionnera pour n’importe quel nombre de colonnes d’option. Les colonnes d’option peuvent avoir toutes les étiquettes que vous désirez.

4) Cette solution suppose qu'il existe une colonne intitulée views.

1
Keith Dowd

Je pense que cela fonctionnerait:

df=df.astype(int)
df[df.columns[:-1]]= np.where(df[df.columns[:-1]]>0, 1, 0)
df[df.columns[:-1]]= df[df.columns[:-1]].mul(df['views'].as_matrix(), axis=0)
0
user4398691

Vous n'avez pas besoin de parcourir les lignes. Celui-ci devrait être plus rapide: Assurez-vous que les valeurs des colonnes sont des entiers.

## convert column type to integer
for i in df:
    df[i] = df[i].astype(int)

## update columns
for col in df:
    if col != 'views':
        df[col] = df[col] * df['views']

df

    option1     option2     option3     views
0      6          0            6          6
1      0          0           10         10  
2      5          5            0          5
3      2          0            0          2
0
YOLO
dataSet = pd.read_Excel("dataset.xlsx")
i = 0 ;
for column in dataSet:
    for i in dataSet[column].iteritems():
        if (column == 'views'):
            print (i)
0
luqman ahmad