[PYTHON] Exemples et contre-mesures pour "Une valeur tente d'être définie sur une copie d'une tranche d'une trame de données." Avertissement chez les pandas

Ce que j'écris dans cet article

Lors de l'analyse de données avec des pandas,

A value is trying to be set on a copy of a slice from a DataFrame.


 J'obtiens souvent l'erreur.

 Traduit littéralement, "Une valeur est sur le point d'être affectée à une copie d'une tranche à partir d'un bloc de données."

 Se produit lors de la tentative d'attribution d'une valeur à la trame de données à partir de laquelle les données ont été extraites de la trame de données dans certaines conditions.

 Cela semble se produire lorsqu'il n'est pas clair si la valeur est reflétée dans la trame de données d'origine lorsque la valeur est affectée à la trame de données de destination d'extraction.

 À cet égard, je résumerai les cas et les contre-mesures que j'ai rencontrés.

# environnement
- python 3.7.4
- pandas 0.25.3
- numpy 1.16.1

# Exemple de code

## Exemple de code qui donne un avertissement

```python
#Créer un DataFrame
df = pd.DataFrame(np.arange(20).reshape((4,5)), columns = list("abcde"))
print(df)

#     a   b   c   d   e
# 0   0   1   2   3   4
# 1   5   6   7   8   9
# 2  10  11  12  13  14
# 3  15  16  17  18  19

df["f"] = 3 #Ceci n'est pas considéré comme une affectation à découper et il n'y a pas d'erreur

#À partir de DataFrame".loc"Et extraire des données
#Extraire en spécifiant les conditions → Ceci est considéré comme une tranche
df_sub = df.loc[df["e"] % 2 == 0]

df_sub["g"] = 100 #Il est considéré comme une affectation à la tranche et un avertissement est émis.
print(df_sub)
#     a   b   c   d   e  f    g
# 0   0   1   2   3   4  3  100
# 2  10  11  12  13  14  3  100
# c:\program files\python37\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead

# See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

Exemple de contre-mesure - Précisez qu'il s'agit d'un autre DataFrame avec .copy ()

Lors de l'extraction en spécifiant des conditions, si vous utilisez .copy () pour indiquer clairement qu'il s'agit d'une copie au lieu d'une tranche, aucun avertissement ne sera émis. Cela signifie que les données seront reflétées dans la destination de la copie et non dans la source de la copie.

df_sub = df.loc[df["e"] % 2 == 0].copy()
df_sub["g"] = 100

Si vous souhaitez refléter les données dans la source de copie, vous pouvez faire quelque chose comme pd.merge ().

Recommended Posts

Exemples et contre-mesures pour "Une valeur tente d'être définie sur une copie d'une tranche d'une trame de données." Avertissement chez les pandas
Dans les pandas python SettingWithCopyWarning Une valeur tente d'être définie sur une copie d'une tranche d'un DataFrame. Essayez d'utiliser .loc [row_indexer, col_indexer] = value à la place
Changer le bloc de données des données d'achat de pandas (produit ID X) en dictionnaire
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (2: Analyse d'image de la vidéo pour obtenir des images candidates)
Que faire si pvcreate produit beaucoup d'AVERTISSEMENT et ne peut pas être créé
Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Avec matplotlib, l'axe vertical sur le côté gauche de l'histogramme est la fréquence, et l'axe vertical sur le côté droit est la fréquence relative (peut-être une mauvaise manière)