2 votes

Filtrage des données dans un dataframe en fonction d'une colonne

Doit filtrer les données dans le dataframe et en créer une seule ligne. J'ai essayé de regrouper mais je veux différentes valeurs à filtrer donc je n'ai pas réussi à le faire. Voici l'exemple

#1      #2      #3      #4
1       Bob     10      Eng
2       Jack    21      Tel
3       Rian    11      Tam
4       Vick    10      Ram
5       Jick    20      Mar
6       Rams    10      Mal
7       Venk    21      Mar

Premièrement, il faut filtrer les lignes sur la colonne #3 en tant que 10 et suivies de 21 comme suit

#1      #2      #3      #4
1       Bob     10      Eng
2       Jack    21      Tel
3       Rams    10      Mal
4       Venk    21      Mal

Ensuite, convertir ces 2 lignes de données en une seule ligne comme ci-dessous

#1      #2      #3      #4      #5
1       Bob     Jack    Eng     Tel
2       Jick    Venk    Mal     Mar

Étant débutant, j'ai essayé de regrouper de plusieurs manières mais les valeurs à choisir sont dans l'ordre : la première ligne doit contenir 10 et la ligne immédiate doit être 21.

Est-ce que quelqu'un peut suggérer quelle API dans pandas m'aidera à accomplir cela?

1voto

Andrej Kesely Points 20452

Essayer :

masque = df["#3"].eq(21) & df["#3"].shift().eq(10)
masque = masque.shift(-1).fillna(False) | masque
x = (
    df[masque]
    .groupby(np.arange(masque.sum()) // 2)
    .apply(lambda x: list(x["#2"]) + list(x["#4"]))
).apply(pd.Series)
x.columns = [f"#{x+2}" for x in x.columns]
x = x.reset_index().rename(columns={"index": "#1"})
x["#1"] += 1
print(x)

Imprime :

   #1    #2    #3   #4   #5
0   1   Bob  Jack  Eng  Tel
1   2  Rams  Venk  Mal  Mar

1voto

U9-Forward Points 8640

Veux-tu dire quelque chose comme?

>>> x = df.loc[(df['#3'].eq(10) & df['#3'].shift(-1).eq(21)) | (df['#3'].shift().eq(10) & df['#3'].eq(21))]
>>> x.groupby(np.arange(len(x)) // 2).apply(lambda x: pd.DataFrame(x.drop(["#1", "#3"], axis=1).to_numpy().flatten()).T).reset_index(drop=True).rename(lambda x: f'#{x + 1}', axis=1)
     #1   #2    #3   #4
0   Bob  Eng  Jack  Tel
1  Rams  Mal  Venk  Mar
>>>

0voto

Manav Shah Points 1

Les listes sont des itérables ordonnés, et le générateur filter lit chaque élément un par un dans cet ordre. Par conséquent, il produira une sortie en ordre.

La fonction filter prend une valeur booléenne en entrée.

list(filter(lambda a: a is 10 or a is 21, col_3))

0voto

Yuya Takashina Points 384

Si 21 vient toujours juste après 10, vous pourriez aimer :

df_shifted = df.shift(-1, axis=0)  # df est le DataFrame original que vous avez.
is_ok = (df["#3"] == 10) & (df_shifted["#3"] == 21)
ans = pd.concat([df[is_ok], df_shifted[is_ok]], axis=1).drop(columns="#3")

Cela va retourner :

  #2   #4  #2   #4
1 Bob  Eng Jack Tel
6 Rams Mal Venk Mar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X