μ½λ μν
# My code
df.loc[0, 'column_name'] = 'foo bar'
Pandas 20.3μμ΄ μ½λλ SettingWithCopyWarningμ λ°μμν€κ³ λ€μμ μ μν©λλ€.
"λμ .loc[row_indexer,col_indexer] = value
μ¬μ©".
μ΄λ―Έ κ·Έλ κ²νκ³ μλλ° μ½κ°μ λ²κ·Έκ°μλ κ² κ°μ΅λλ€. λλ Jupyterλ₯Ό μ¬μ©ν©λλ€.
κ°μ¬ν©λλ€! :)
pd.show_versions()
μ»€λ° : μμ
νμ΄μ¬ : 3.6.1.final.0
νμ΄μ¬ λΉνΈ : 64
μ΄μ체μ : Windows
OS λ¦΄λ¦¬μ€ : 8.1
κΈ°κ³ : AMD64
νλ‘μΈμ : Intel64 Family 6 Model 61 Stepping 4, GenuineIntel
byteorder : μ‘°κΈ
LC_ALL : μμ
LANG : μμ
λ‘μΌμΌ : μμ. μμ
νλ€ : 0.20.1
pytest : 3.0.7
ν : 9.0.1
setuptools : 35.0.2
μ¬μ΄ ν€ : 0.25.2
numpy : 1.12.1
scipy : 0.19.0
xarray : μμ
IPython : 5.3.0
μ€νν¬μ€ : 1.5.6
ν¨μ : 0.4.1
dateutil : 2.6.0
pytz : 2017.2
blosc : μμ
λ³λͺ© νμ : 1.2.1
ν : 3.2.2
numexpr : 2.6.2
κΉνΈ : μμ
matplotlib : 2.0.2
openpyxl : μμ
xlrd : 1.0.0
xlwt : 1.2.0
xlsxwriter : 0.9.6
lxml : 3.7.3
bs4 : 4.6.0
html5lib : 0.999
sqlalchemy : 1.1.9
pymysql : μμ
psycopg2 : μμ
jinja2 : 2.9.6
s3fs : μμ
pandas_gbq : μμ
pandas_datareader : μμ
@NadiaRom μ 체 μμ λ₯Ό μ 곡 ν μ μμ΅λκΉ? νμ€ν λ§νκΈ°λ μ΄λ ΅μ§λ§ df
λ λ·°λ μΉ΄νΌ μΌ μμλ μμ
μμ λΉλ‘―λ κ² κ°μ΅λλ€. μλ₯Ό λ€λ©΄ :
In [8]: df = pd.DataFrame({"A": [1, 2], "B": [3, 4], "C": [4, 5]})
In [9]: df1 = df[['A', 'B']]
In [10]: df1.loc[0, 'A'] = 5
/Users/taugspurger/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/indexing.py:180: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
/Users/taugspurger/Envs/pandas-dev/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
#!/Users/taugspurger/Envs/pandas-dev/bin/python3.6
λ°λΌμ df1
μ¬λ°λ₯΄κ² μ
λ°μ΄νΈνκ³ μμ΅λλ€. λͺ¨νΈμ±μ df
λ μ
λ°μ΄νΈ λ κ²μΈμ§ μ¬λΆμ
λλ€. λΉμ·ν μΌμ΄ μΌμ΄λκ³ μλ€κ³ μκ°νμ§λ§ μ¬ν κ°λ₯ν μκ° μμΌλ©΄ νμ€ν λ§νκΈ°κ° μ΄λ ΅μ΅λλ€.
@TomAugspurger λ€μμ μΌλ°μ μΌλ‘ .locμμ΄ ν¬λμ κ°μ ν λΉνμ§ μλ μ½λμ λλ€.
df = pd.read_csv('df_unicities.tsv', sep='\t')
df.replace({'|': '--'}, inplace=True)
df_c = df.loc[df.encountry == country, : ]
df_c['sort'] = (df_c.encities_ua == 'all').astype(int) # new column
df_c['sort'] += (df_c.encities_foreign == 'all').astype(int)
df_c.sort_values(by='sort', inplace=True)
# ---end of chunk, everything is fine ---
if df_c.encities_foreign.str.contains('all').sum() < len(df_c):
df_c.loc[df_c.encities_foreign.str.contains('all'), 'encities_foreign'] = 'other'
df_c.loc[df_c.cities_foreign.str.contains('Π²ΡΡ'), 'cities_foreign'] = 'ΡΠ½ΡΡ'
else:
df_c.loc[df_c.encities_foreign.str.contains('all'), 'encities_foreign'] = country
df_c.loc[df_c.cities_foreign.str.contains('Π²ΡΡ'), 'cities_foreign'] = df_c.country.iloc[0]
if df_c.encities_ua.str.contains('all').sum() < len(df_c):
df_c.loc[df_c.encities_ua.str.contains('all'), 'encities_ua'] = 'other'
df_c.loc[df_c.cities_ua.str.contains('Π²ΡΡ'), 'cities_ua'] = 'ΡΠ½ΡΡ'
else:
df_c.loc[df_c.encities_ua.str.contains('all'), 'encities_ua'] = 'Ukraine'
df_c.loc[df_c.cities_ua.str.contains('Π²ΡΡ'), 'cities_ua'] = 'Π£ΠΊΡΠ°ΡΠ½Π°'
# Warning after it
λΉ λ₯Έ λ΅λ³ κ°μ¬ν©λλ€!
μ¬κΈ°μ λ¬Έμ λ 4 νμμ .loc
λ‘ λ¨Όμ λ°μ΄ν° νλ μμ λΆν νλ€λ κ²μ
λλ€. ν΄λΉ μ¬λΌμ΄μ€μ κ°μ ν λΉνλ €λ μλμ
λλ€.
df_c = df.loc[df.encountry == country, :]
Pandasλ κ°μ df_c
μ¬λΌμ΄μ€μλ§ ν λΉν μ§ μλλ©΄ μλ df
κΉμ§ λ€μ μ νν μ§ 100 % νμ νμ§ λͺ»ν©λλ€. df_c
λ₯Ό μ²μ ν λΉ ν λμ΄λ₯Ό λ°©μ§νλ €λ©΄ λ€μμ μ¬μ©νμ¬ ν¬λμκ² μ체 λ°μ΄ν° νλ μ (μ¬λΌμ΄μ€κ° μλ)μμ μλ €μΌν©λλ€.
df_c = df.loc[df.encountry == country, :].copy()
μ΄λ κ²νλ©΄ μ€λ₯κ° μμ λ©λλ€. μ΄ μΈ‘λ©΄μμ λ§μ μ¬μ©μκ° ν¬λλ‘ μΈν΄ νΌλμ€λ¬μνλ κ²μ μμμΌλ―λ‘ μμ μ€λͺ μ λκΈ° μν΄ κ°λ¨ν μμ λ₯Ό μ 곡νκ² μ΅λλ€.
>>> import pandas as pd
>>> df = pd.DataFrame({'A':[1,2,3,4,5], 'B':list('QQQCC')})
>>> df
A B
0 1 Q
1 2 Q
2 3 Q
3 4 C
4 5 C
>>> df.loc[df['B'] == 'Q', 'new_col'] = 'hello'
>>> df
A B new_col
0 1 Q hello
1 2 Q hello
2 3 Q hello
3 4 C NaN
4 5 C NaN
λ°λΌμ μμ λ΄μ©μ μμλλ‘ μλν©λλ€! μ΄μ λ°μ΄ν°λ‘ μλν μμ μ λ°μνλ μμ λ₯Ό μλν΄ λ³΄κ² μ΅λλ€.
>>> df = pd.DataFrame({'A':[1,2,3,4,5], 'B':list('QQQCC')})
>>> df_q = df.loc[df['B'] == 'Q']
>>> df_q
A B
0 1 Q
1 2 Q
2 3 Q
>>> df_q.loc[df['A'] < 3, 'new_col'] = 'hello'
/Users/riddellcd/anaconda/lib/python3.6/site-packages/pandas/core/indexing.py:337: 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/indexing.html#indexing-view-versus-copy
self.obj[key] = _infer_fill_value(value)
>>> df_q
A B new_col
0 1 Q hello
1 2 Q hello
2 3 Q NaN
κ°μ μ€λ₯κ° λ°μν κ² κ°μ΅λλ€! νμ§λ§ μμλλ‘ df_q
λ³κ²½λμμ΅λλ€! μ΄κ²μ df_q
μ΄ df
μ μ‘°κ°μ΄κΈ° λλ¬Έμ
λλ€. λ°λΌμ .loc []μ μ¬μ©νλλΌλ df_q
pandasλ λ³κ²½ μ¬νμ μ ννμ§ μμ κ²μ΄λΌκ³ κ²½κ³ ν©λλ€. ~ df
. μ΄λ₯Ό λ°©μ§νλ €λ©΄ λ λͺ
μ μ μΌλ‘ df_q
df
λ₯Ό λͺ
μ μ μΌλ‘ μ μΈνμ¬
df_q
μμ λ€μ μμνμ§λ§ μ΄λ²μλ .copy()
ν©λλ€.
>>> df_q = df.loc[df['B'] == 'Q'].copy()
>>> df_q
A B
0 1 Q
1 2 Q
2 3 Q
Lets try to reassign our value now!
>>> df_q.loc[df['A'] < 3, 'new_col'] = 'hello'
>>> df_q
A B new_col
0 1 Q hello
1 2 Q hello
2 3 Q NaN
df_q
μ΄ df
μ (κ³Ό) λ³κ°λΌκ³ Pandasμκ² μλ € μ£ΌμμΌλ―λ‘ μ€λ₯μμ΄ μλν©λλ€.
μ€μ λ‘ df_c
λν μ΄λ¬ν λ³κ²½ μ¬νμ΄ μ΅λ df
κΉμ§ μ νλκΈ°λ₯Ό μνλ©΄ μμ ν λ€λ₯Έ μ μ΄λ©° μνλ κ²½μ° λλ΅ ν κ²μ
λλ€.
@CRiddler μ’μμ, κ°μ¬ν©λλ€ !
μΈκΈνλ―μ΄ μ°κ²°λ .loc
μ (λ) μκΈ°μΉ μμ κ²°κ³Όλ₯Ό λ°ν ν μ μ΄ μμ΅λλ€. λ΄κ° μ΄ν΄νλ λ°μ κ°μ΄, .copy()
λ Pandasκ° μ νν df_sliced_once
λ₯Ό λ³λμ κ°μ²΄λ‘ μ·¨κΈνκ³ μ΄κΈ° μ 체 df
λ₯Ό λ³κ²½νμ§ μλλ‘ν©λλ€. λλ μ§ μμΌλ©΄ μμ ν΄μ£ΌμΈμ.
λ¬Έμλ μ¬κΈ° http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning -a-view-versus-a-copyμ΄λ©° @CRiddler μλ λ©μ§ μ€λͺ
μ΄ μμ΅λλ€. μΌλ°μ μΌλ‘ inplace
λ μ¬μ©νμ§ μμμΌν©λλ€.
μ€μ λ‘
df_c
λν μ΄λ¬ν λ³κ²½ μ¬νμ΄ μ΅λdf
κΉμ§ μ νλκΈ°λ₯Ό μνλ©΄ μμ ν λ€λ₯Έ μ μ΄λ©° μνλ κ²½μ° λλ΅ ν κ²μ λλ€.
@CRiddler κ°μ¬ν©λλ€. μ΄κΈ° λ°μ΄ν° νλ μμΌλ‘ μ ννκ±°λ μν λ°©λ²μ νμ ν λ μΆκ° ν μμλ Stack Overflowμ λ΅λ³λ³΄λ€ λ«μ΅λλ€.
@persep μΌλ°μ μΌλ‘ λ¬Έμ λ₯Ό
μλ³Έ λ°μ΄ν° :
>>>import pandas as pd
>>> df = pd.DataFrame({'A':[1,2,3,4,5], 'B':list('QQQCC')})
>>> df
A B
0 1 Q
1 2 Q
2 3 Q
3 4 C
4 5 C
μμ λ°μ΄ν° νλ μμ λ§λ€λ©΄ λ³κ²½ μ¬νμ΄ μ νλμ§ μμ΅λλ€.
μ΄μ μμμ λ³Ό μ μλ―μ΄ df_q
λ§ λ³κ²½νκ³ pandas κ²½κ³ κ° λ°μν©λλ€ (μ¬κΈ°μ λ³΅μ¬ / λΆμ¬ λ£κΈ°λμ§ μμ). κ·Έλ¦¬κ³ df
λ³κ²½ μ¬νμ μ ννμ§ μμ΅λλ€.
>>> df_q = df.loc[df["B"] == "Q"]
>>> df_q.loc[df["A"] < 3, "new_column"] = "hello"
# df remains unchanged because we only made changes to `df_q`
>>> df
A B
0 1 Q
1 2 Q
2 3 Q
3 4 C
4 5 C
λ΄κ° μλ ν, μμ λμΌν μ½λλ₯Ό μ¬μ©νκ³ λ³κ²½ μ¬νμ κ°μ λ‘ μλ λ°μ΄ν° νλ μμΌλ‘ μ ννλ λ°©λ²μ μμ΅λλ€.
κ·Έλ¬λ μ°λ¦¬κ° μκ°μ μ‘°κΈ λ°κΎΈκ³ μμ ν λΆλΆ μ§ν© λμ λ§μ€ν¬λ‘ μμ
νλ©΄ μνλ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. μ΄κ²μ΄ λ°λμ νμ μ§ν©μ μλ λ°μ΄ν° νλ μμ λ³κ²½ μ¬νμ "μ ν"νλ κ²μ μλμ§λ§, λ³κ²½ μ¬νμ΄ μλ λ°μ΄ν° νλ μ df
μμ λ°μνλλ‘ λ³΄μ₯ν©λλ€. μ΄λ₯Ό μν΄ λ¨Όμ λ§μ€ν¬λ₯Ό λ§λ λ€μ df
νμ μ§ν©μ λ³κ²½νλ €λ κ²½μ° λ§μ€ν¬λ₯Ό μ μ©ν©λλ€.
>>> q_mask = df["B"] == "Q"
>>> a_mask = df["A"] < 3
# Combine masks (in this case we used "&") to achieve what a nested subset would look like
# In the same step we add in our item assignment. Instructing pandas to create a new column in `df` and assign
# the value "hello" to the rows in `df` where `q_mask` & `a_mask` overlap.
>>> df.loc[q_mask & a_mask, "new_col"] = "hello"
# Successful "propagation" of new values to the original dataframe
>>> df
A B new_col
0 1 Q hello
1 2 Q hello
2 3 Q NaN
3 4 C NaN
4 5 C NaN
λ§μ§λ§μΌλ‘, df_qκ° μ΄λ»κ² μκ²Όλμ§λ³΄κ³ μΆλ€λ©΄ q_mask
μ¬μ©νμ¬ μλ λ°μ΄ν° νλ μμμ νμ μ§ν©μ νμ μ¬μ©ν μ μμ΅λλ€.
>>> df.loc[q_mask, :]
A B new_col
0 1 Q hello
1 2 Q hello
2 3 Q NaN
μ΄κ²μ΄ λ°λμ df_q
μμ df
"μ ν"λλ κ²μ μλμ§λ§ λμΌν κ²°κ³Όλ₯Ό μ»μ΅λλ€. μ€μ μ νλ λͺ
μ μ μΌλ‘ μνλμ΄μΌνλ©° λ§μ€ν¬λ‘ μμ
νλ κ²λ³΄λ€ ν¨μ¨μ±μ΄ λ¨μ΄μ§λλ€.
@CRiddler κ°μ¬ν©λλ€, λΉμ μ λ§€μ° λμμ΄λμμ΅λλ€
κ°μ₯ μ μ©ν λκΈ
μ¬κΈ°μ λ¬Έμ λ 4 νμμ
.loc
λ‘ λ¨Όμ λ°μ΄ν° νλ μμ λΆν νλ€λ κ²μ λλ€. ν΄λΉ μ¬λΌμ΄μ€μ κ°μ ν λΉνλ €λ μλμ λλ€.Pandasλ κ°μ
df_c
μ¬λΌμ΄μ€μλ§ ν λΉν μ§ μλλ©΄ μλdf
κΉμ§ λ€μ μ νν μ§ 100 % νμ νμ§ λͺ»ν©λλ€.df_c
λ₯Ό μ²μ ν λΉ ν λμ΄λ₯Ό λ°©μ§νλ €λ©΄ λ€μμ μ¬μ©νμ¬ ν¬λμκ² μ체 λ°μ΄ν° νλ μ (μ¬λΌμ΄μ€κ° μλ)μμ μλ €μΌν©λλ€.μ΄λ κ²νλ©΄ μ€λ₯κ° μμ λ©λλ€. μ΄ μΈ‘λ©΄μμ λ§μ μ¬μ©μκ° ν¬λλ‘ μΈν΄ νΌλμ€λ¬μνλ κ²μ μμμΌλ―λ‘ μμ μ€λͺ μ λκΈ° μν΄ κ°λ¨ν μμ λ₯Ό μ 곡νκ² μ΅λλ€.
ꡬμ±λ λ°μ΄ν°κ°μλ μ
λ°λΌμ μμ λ΄μ©μ μμλλ‘ μλν©λλ€! μ΄μ λ°μ΄ν°λ‘ μλν μμ μ λ°μνλ μμ λ₯Ό μλν΄ λ³΄κ² μ΅λλ€.
κ°μ μ€λ₯κ° λ°μν κ² κ°μ΅λλ€! νμ§λ§ μμλλ‘
df_q
λ³κ²½λμμ΅λλ€! μ΄κ²μdf_q
μ΄df
μ μ‘°κ°μ΄κΈ° λλ¬Έμ λλ€. λ°λΌμ .loc []μ μ¬μ©νλλΌλdf_q
pandasλ λ³κ²½ μ¬νμ μ ννμ§ μμ κ²μ΄λΌκ³ κ²½κ³ ν©λλ€. ~df
. μ΄λ₯Ό λ°©μ§νλ €λ©΄ λ λͺ μ μ μΌλ‘df_q
df
λ₯Ό λͺ μ μ μΌλ‘ μ μΈνμ¬df_q
μμ λ€μ μμνμ§λ§ μ΄λ²μλ.copy()
ν©λλ€.df_q
μ΄df
μ (κ³Ό) λ³κ°λΌκ³ Pandasμκ² μλ € μ£ΌμμΌλ―λ‘ μ€λ₯μμ΄ μλν©λλ€.μ€μ λ‘
df_c
λν μ΄λ¬ν λ³κ²½ μ¬νμ΄ μ΅λdf
κΉμ§ μ νλκΈ°λ₯Ό μνλ©΄ μμ ν λ€λ₯Έ μ μ΄λ©° μνλ κ²½μ° λλ΅ ν κ²μ λλ€.