Mémorandum (pseudo Vlookup par pandas)

introduction

https://qiita.com/wellwell3176/items/e6a17609c7398dd7d496

Le programme créé ci-dessus a été amélioré, je vais donc le résumer.

** Ne le saisissez pas sur Excel, calculez simplement tout sur python et ne jetez que le résultat dans Excel, non? ** **

J'ai remarqué que c'était trop naturel, donc j'ai l'impression que c'est devenu assez compact. J'ai utilisé openpyxl jusqu'à présent, mais cette fois j'ai utilisé des pandas. La différence entre les deux n'est toujours pas bien comprise.

9/30 postscript: Dans la section commentaires, @nkay a présenté une méthode plus sophistiquée que cette méthode, donc je la posterai. Le résultat est presque le même (seule la colonne "Catégorie + Entreprise" est en plus générée).

Méthode de proposition


import pandas as pd

df_master = pd.read_excel('/content/drive/My Drive/Colab Notebooks/table.xlsx')
df_test = pd.read_excel('/content/drive/My Drive/Colab Notebooks/data5.xlsx')

out = df_test.merge(df_master, on=['Classification', 'Entreprise'], how='left')
out.to_excel('/content/drive/My Drive/Colab Notebooks/data6.xlsx', index=False)

Résultat

image.png Figure: Sortie Excel (code couleur plus tard) C'est bien car il est possible de rechercher et de sortir les éléments qui correspondent au paramètre 1 et au paramètre 2 à partir de la classification + contenu métier. Il n'y a pas de lignes inutiles qui seront inutiles au moment de la soumission finale, et c'est rafraîchissant. https://qiita.com/wellwell3176/items/e6a17609c7398dd7d496 Par rapport à la figure 2 dans, vous pouvez clairement voir que la sortie est à un niveau utilisable.

program


import pandas as pd
df_master=pd.read_excel('/content/drive/My Drive/Colab Notebooks/table.xlsx')
df_test=pd.read_excel('/content/drive/My Drive/Colab Notebooks/data5.xlsx')

row_count=len(df_test.index)  #Obtenez la longueur de la table pour déterminer le nombre de boucles dans l'instruction for

for i in range(0,row_count): #.iterrows n'a pas fonctionné pour une raison quelconque
  kubun = df_test.at[(i,"Classification")]
  gyomu = df_test.at[(i,"Entreprise")]
  kubun_gyomu=(df_master['Classification'] == kubun) & (df_master["Entreprise"] == gyomu) #ClassificationとEntrepriseが一致する行をBoolで判定

  row_true=df_master[kubun_gyomu] #Extraire uniquement les vraies lignes du bloc de données
  set1_val=row_true.iat[0,3]
  set2_val=row_true.iat[0,4] #Réglage 1/Puisque la position de 2 est déterminée de manière unique, spécifiez la position numériquement. Je ne pouvais pas faire quelque chose comme la colonne "Setting 2" de la 0ème ligne.
#J'ai l'impression qu'il y a trop de variables, mais si je ne les divise pas autant, il semble que ce que je fais plus tard sera rafraîchissant, alors je l'ai divisé.

  df_test.at[(i,"Réglage 1")]=set1_val 
  df_test.at[(i,"Réglage 2")]=set2_val #こっちの指定はi行目”Réglage 2”列が可能。よく分からん。

df_test.to_excel('/content/drive/My Drive/Colab Notebooks/data6.xlsx',index=False)

Messages d'erreur et échecs que j'ai vus lors de la création

ValueError: At based indexing on an integer index can only have integer indexers

python


for i in df_test.iterrows():
  kubun = df_test.at[(i,"Classification")]
  gyomu = df_test.at[(i,"Entreprise")]

-->ValueError: At based indexing on an integer index can only have integer indexers
 #i=[0]De[Nombre de dernières lignes du bloc de données]Je pensais que ça marcherait en spécifiant, mais ça ne sert à rien
 #La raison est encore inconnue. Il semble que je ne contienne pas de valeur entière ...
 #Résolu en spécifiant la longueur avec la fonction de gamme comme le produit fini

**. Erreur clé lors de l'utilisation à [0, "hogehoge"] **

Version échouée


for i in range(0,45):
  kubun = df_test.at[(i,"Classification")] #テストファイルからClassificationの値を引っ張り出す
  kubun_correct=(df_master['Classification'] == kubun) #Rechercher le fichier maître et le crochet
  row_true=df_master[kubun_correct] #Tirez seulement la vraie ligne
  set1_val=row_true.at[0,"Réglage 1"] #J'ai été surpris ici en train d'essayer de sortir les données de la première ligne "paramètre 1" colonne qui a émis vrai
  df_test.at[(i,"Réglage 1")]=set1_val  #Je voulais remplacer les données du paramètre correspondant 1 dans Excel

-->key error 0
#La cause est.Je ne comprends pas que at est une référence de chaîne. je=Une erreur s'est produite à 10 (classification = construction).
#Imprimer à ce moment(kubun_correct)Le résultat de
0     False
1     False
2      True
3      True
#print(row_true)Ensuite, ce sera comme suit
Catégorie Réglage commercial 1 Réglage 2
2 Construction Weekday Regular B South
3 Construction Holiday Irrégulier B Nord
#À ce moment, rangée_true.at[0,"Réglage 1"]は、”0”行の”Réglage 1”列を読み込みに行くが、0行はあるものの"0"Ne peut pas être référencé car il n'y a pas de ligne
#Par conséquent, comme un produit fini.Résolu en référençant 0 lignes et 3 colonnes avec iat

Les références

Comment obtenir la valeur de cellule de Pandas DataFrame https://www.delftstack.com/ja/howto/python-pandas/how-to-get-a-value-from-a-cell-of-a-dataframe/ Comment extraire uniquement la valeur des données extraites par Pandas https://tipstour.net/python-pandas-get-value Extraire (sélectionner) des lignes de AND, OR, NOT de plusieurs conditions avec des pandas https://note.nkmk.me/python-pandas-multiple-conditions/

Recommended Posts

Mémorandum (pseudo Vlookup par pandas)
Mémorandum de Pandas
mémorandum pandas
Mémorandum d'opération Pandas
Trier par pandas
[Pour enregistrement] Mémorandum Pandas
pandas Matplotlib Résumé par utilisation
Standardisez par groupe avec les pandas
Mémo de visualisation par pandas, seaborn
Mémorandum @ Python OU Séminaire: Pandas
Manipuler des chaînes avec un groupe pandas par
Génération de fonctionnalités avec pandas group par