Pandas: .loc [...] = рдорд╛рди рджреЗрддрд╛ рд╣реИ SettingWithCopyWarning

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рд╕рд┐рддре░ 2017  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

рдХреЛрдб рдирдореВрдирд╛

# My code
df.loc[0, 'column_name'] = 'foo bar'

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг

рдкрдВрдбреЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдб 20.3 рдлреЗрдВрдХрддрд╛ рд╣реИ

"рдЗрд╕рдХреЗ рдмрдЬрд╛рдп .loc[row_indexer,col_indexer] = value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ"ред

рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝рд╛ рдмрдЧ рд╣реИред рдореИрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рдзрдиреНрдпрд╡рд╛рдж! :)

pd.show_versions() рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ


рдкреНрд░рддрд┐рдмрджреНрдз: рдХреЛрдИ рдирд╣реАрдВ
рдЕрдЬрдЧрд░: 3.6.1.final.0
рдкрд╛рдпрдерди-рдмрд┐рдЯреНрд╕: 64
рдУрдПрд╕: рд╡рд┐рдВрдбреЛрдЬ
OS- рд░рд┐рд▓реАрдЬрд╝: 8.1
рдорд╢реАрди: AMD64
рдкреНрд░реЛрд╕реЗрд╕рд░: Intel64 рдлреИрдорд┐рд▓реА 6 рдореЙрдбрд▓ 61 рд╕реНрдЯреЗрдкрд┐рдВрдЧ 4, рдЬреЗрдиреНрдпреБрдЕрд▓ рдЖрдИрдЯреЗрд▓
рдмрд╛рдЗрдЯрдСрд░реНрдбрд░: рдереЛрдбрд╝рд╛
LC_ALL: рдХреЛрдИ рдирд╣реАрдВ
рд▓реИрдВрдЧ: рдХреЛрдИ рдирд╣реАрдВ
LOCALE: рдХреЛрдИ рдирд╣реАрдВред рдХреЛрдИ рдирд╣реАрдВ

рдкрд╛рдВрдбрд╛: 0.20.1
pytest: 3.0.7
рдкрд╛рдЗрдк: 9.0.1
рд╕реЗрдЯрдкреНрдЯреВрд▓: 35.0.2
рд╕рд╛рдЗрдерди: 0.25.2
рд╕реБрдиреНрди: 1.12.1
scipy: 0.19.0
xarray: рдХреЛрдИ рдирд╣реАрдВ
рдЖрдИрдкреАрдереЙрди: 5.3.0
рд╕реНрдлрд┐рдВрдХреНрд╕: 1.5.6
patsy: 0.4.1
рджрд┐рдирд╛рдВрдХ: 2.6.0
pytz: 2017.2
рдмреНрд▓реЙрд╕реНрдХ: рдХреЛрдИ рдирд╣реАрдВ
рдЕрдбрд╝рдЪрди: 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
рд╕реНрдХреНрд╡реИрд▓реНрд╕реАрдореЗ: 1.1.9
pymysql: рдХреЛрдИ рдирд╣реАрдВ
рдорд╛рдирд╕ 2: рдХреЛрдИ рдирд╣реАрдВ
jinja2: 2.9.6
s3fs: рдХреЛрдИ рдирд╣реАрдВ
pandas_gbq: рдХреЛрдИ рдирд╣реАрдВ
pandas_datareader: рдХреЛрдИ рдирд╣реАрдВ

Indexing Usage Question

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд▓рд╛рдЗрди рдореЗрдВ .loc рд╕рд╛рде рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рд╕реНрд▓рд╛рдЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ред

df_c = df.loc[df.encountry == country, :]

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ df_c рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрдВрдбреЛрдВ рдХреЛ 100% рдпрдХреАрди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рднреА рддрд░рд╣ рд╕реЗ рдореВрд▓ df рддрдХ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ 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 рдХрд╛ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ [] df_q рдкрд╛рдВрдбрд╛ рд╣рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╕реЗ 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 рд╕реЗ рдЕрд▓рдЧ рд╣реИ

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ df_c рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП df рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрдиреНрдп рдмрд┐рдВрджреБ thats рдФрд░ рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ 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

рддреЗрдЬреА рд╕реЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд▓рд╛рдЗрди рдореЗрдВ .loc рд╕рд╛рде рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рд╕реНрд▓рд╛рдЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ред

df_c = df.loc[df.encountry == country, :]

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ df_c рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрдВрдбреЛрдВ рдХреЛ 100% рдпрдХреАрди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рднреА рддрд░рд╣ рд╕реЗ рдореВрд▓ df рддрдХ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ 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 рдХрд╛ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ [] df_q рдкрд╛рдВрдбрд╛ рд╣рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╕реЗ 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 рд╕реЗ рдЕрд▓рдЧ рд╣реИ

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ df_c рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП df рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрдиреНрдп рдмрд┐рдВрджреБ thats рдФрд░ рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред

@ рдХреНрд░рд┐рд╕рд▓рд░ рдЧреНрд░реЗрдЯ, рдзрдиреНрдпрд╡рд╛рдж !
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрдВрдЬреАрд░ .loc рдиреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рдП рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, .copy() рдкрд╛рдВрдбреЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЪрдпрдирд┐рдд df_sliced_once рдХреЛ рдЕрд▓рдЧ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреВрд░реНрдг df рдмрджрд▓рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рд╕рд╣реА рд╣реИ рдЕрдЧрд░ рдореИрдВ smth рдорд┐рд▓рд╛рдпрд╛ред

рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рд╣реИ http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning -рдПрдХ-рд╡реНрдпреВ рдмрдирд╛рдо рдПрдХ рдХреЙрдкреА рдФрд░ @CRiddler рдПрдХ рдЕрдЪреНрдЫрд╛ expl рд╣реИред рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ inplace рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ df_c df рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЙрддреНрддрд░ рджреЗрдВрдЧреЗред

@ рдХреНрд░рд┐рд╕рд▓рд░ рдзрдиреНрдпрд╡рд╛рдж рдЖрдкрдХрд╛ рдЙрддреНрддрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рдЬрдм рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

@ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореБрдЭреЗ рдорджрдж рдХреЗ рд▓рд┐рдП рдореЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╕реЗ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдЧреЗ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред рдкрд╛рдВрдбрд╛ред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░ рдореЗрдВ рдирд╣реАрдВ рдШрдЯрд╛рдХрд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореБрдЦреМрдЯреЗ рдХреЛ рдЪрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ- рдлрд┐рд░ рдорд╛рд╕реНрдХ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЬреЛрдбрд╝ рджреЗрдВ рдФрд░ рдореВрд▓ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рдорд╛рд╕реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдХреБрдЫ рдХреЛ рдШреВрдордиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред ред

рдореВрд▓ рдбреЗрдЯрд╛:

>>>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 рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкрд╛рдВрдбрд╛ рдЪреЗрддрд╛рд╡рдиреА (рдпрд╣рд╛рдВ рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХреА рдЧрдИ) рдЙрдард╛рддрд╛ рд╣реИред рдФрд░ 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 рд╣рдо рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдХреЗрд╡рд▓ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред

@ рдХреНрд░рд┐рд╕рд▓рд░ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд░рд╣реЗ рд╣реИрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jaradc picture jaradc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Ashutosh-Srivastav picture Ashutosh-Srivastav  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

songololo picture songololo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

venuktan picture venuktan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

matthiasroder picture matthiasroder  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ