Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:
Вы пишете
lst = [[1] * 4] * 3
Это эквивалентно:
lst1 = [1]*4
lst = [lst1]*3
Это означает, что lst
- это список с 3 элемента, указывающие на lst1
. Это означает, что две следующие строки эквивалентны:
lst[0][0] = 5
lst1[0] = 5
Поскольку lst[0]
- это только lst1
.
Чтобы получить желаемое поведение, вы можете использовать понимание списка:
lst = [ [1]*4 for n in xrange(3) ]
В этом случае выражение переоценивается для каждого n, что приводит к другому списку.
В случае 1, df['A']
создает копию df
. Как поясняется в документации Pandas , это может привести к неожиданным результатам при цепочке, поэтому возникает предупреждение. Случай 2 выглядит корректно, но возможны ложные срабатывания:
Предупреждение. Приведенные в цепочку предупреждения / исключения назначаются для информирования пользователя о возможном недопустимом назначении. Могут быть ложные срабатывания; ситуации, в которых непреднамеренно сообщается цепочное присваивание.
blockquote>Чтобы отключить
SettingWithCopyWarning
для одного кадра данных, используйтеdf.is_copy = False
Чтобы полностью отключить привязанные назначения, использовать
options.mode.chained_assignment = None
Другое решение, которое должно подавлять предупреждение:
df = df.copy()
df['B'] = df['A']/25
df['B'] = df['A']/50
pd.set_option('chained_assignment',None)
– danger89 20 January 2017 в 13:28