J'ai du mal à faire face à Python. J'ai PD Dataframe et j'ai besoin de laisser tomber toutes les lignes, qui arrivent après des valeurs spécifiques (dans les valeurs de code sont écrites à la liste des années appelées) toutes les valeurs doivent être regroupées par le nom de la société, car ces observations appartiennent aux sociétés mentionnées dans la colonne 'Inn_Main '. Je ne comprends vraiment pas comment faire cela avec des fonctionnalités de Pandas. J'ai trouvé un moyen cependant, mais c'est très moche et pas très efficace.
import pandas as pd data = {'inn_main':['Apple', 'Apple', 'Apple', 'Apple', 'Tesla', 'Tesla', 'Tesla'], 'Help':['OK', 'OK', 2013, 'OK','OK', 2014, 'OK']} df = pd.DataFrame(data) droper=[] block=0 years=[2012,2013,2014,2015,2016,2017,2018] for j in range(len(list(df['Help'].groupby(df['inn_main'])))): alarm=0 for i in range(len(list(df['Help'].groupby(df['inn_main']))[j][1].index.values)): if list(df['Help'].groupby(df['inn_main']))[j][1][list(df['Help'].groupby(df['inn_main']))[j][1].index.values[i].astype(int)] in years: block=1 alarm=1 if block==1: block=0 else: if alarm==1: droper.append(list(df['Help'].groupby(df['inn_main']))[j][1].index.values[i].astype(int)) df.drop(index=droper)
3 Réponses :
Je ne sais pas grand chose de Panda ni de ce que vous essayez de faire, mais voici le code refactored à la liste d'itérer au lieu d'utiliser des index:
import pandas as pd data = {'inn_main':['Apple', 'Apple', 'Apple', 'Apple', 'Tesla', 'Tesla', 'Tesla'], 'Help':['OK', 'OK', 2013, 'OK','OK', 2014, 'OK']} df = pd.DataFrame(data) droper=[] years=[2012,2013,2014,2015,2016,2017,2018] for j in list(df['Help'].groupby(df['inn_main'])): alarm=False for i in j[1].index.values: if j[1][i.astype(int)] in years: alarm=True elif alarm: droper.append(i.astype(int)) df.drop(index=droper)
Lol le gars ci-dessus sait beaucoup sur les pandas, il l'a fait avec 1 chaîne: D
Je ne comprends pas complètement ce que vous demandez, mais voici ce que je pense que vous voulez. Compte tenu du fichier de données suivant ... ... Vous voulez identifier chaque ligne où Ceci donnera: p> si vous voulez Drop tous les lignes d'une entreprise qui suivent une ligne donnée, le complet Réponse de Valdi_bo montre Comment. p> p> df.help code> est dans une liste de
années code > et laissez tomber la ligne qui vient après elle (dans les lignes appartenant à une entreprise donnée). Si c'est correct, vous pouvez le faire beaucoup plus simplement: p>
La solution est étonnamment courte: Le résultat est le suivant: p> Détails: p> Pour le confirmer, ajoutez une autre ligne contenant Tesla em> et ok em> à
votre Dataframe et exécutez son code. p> Le résultat est le suivant: p>
df.groupby ("inn_main") code> - Groupe le Dataframe par les entreprises. LI>
Appliquer (Lambda GRP: Code> - Appliquez une fonction Lambda à chaque groupe. LI>
grp.help.isin (années) code> - est aide em> valeur dans ans em>? li>
.Cumsum () code> - somme cumulative pour la question ci-dessus. li>
Shift (Fill_Value = 0) CODE> - Décalage le résultat de 1 rangée, remplissage
tout nan em> (en fait le premier élément) avec 0 em>. li>
astype (bool) code> - convertissez des entiers vers bool em>. li>
~ code> - nier le résultat ci-dessus li>
[...] code> - Utilisez le résultat ci-dessus dans indexation booléenne em>. li>
GRP [...] code> - retourner "bonnes" rangées du groupe actuel (ils vont
être la partie du résultat pour le groupe actuel). li>
ul>
inn_main Help
0 Apple OK
1 Apple OK
2 Apple 2013
4 Tesla OK
5 Tesla 2014
7 Tesla OK
Je ne pouvais pas dire si c'est ce que vous recherchez ou non - probablement c'est la bonne solution pour de nombreux cas!
Je ne suis pas d'accord. L'OP a écrit clairement: goutte toutes les lignes b>, qui arrivent après des valeurs spécifiques i> (pas le premier uniquement).
Merci beaucoup, je voulais vraiment laisser tomber toutes les lignes après des valeurs spécifiques.
Publiez un exemple de ce que vous voulez que la sortie de Dataframe ressemble à
Et pouvez-vous essayer d'expliquer avec des mots la logique que vous utilisez?