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
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