Копировать значения между столбцами панд данных - PullRequest
1 голос
/ 05 марта 2019

Вчера я потратил много времени, пытаясь скопировать значения в одном столбце (столбец A) кадра данных pandas в другой столбец (столбец B) в том же кадре данных.Столбцы представляют собой числа с плавающей запятой с числовыми значениями и значениями NaN.

Я исследовал этот сайт, переполнение стека, Google и т. Д., И все, что я пробовал, либо не удавалось, ничего не делал и / или давало мне предупреждение SettingWithCopyWarning.Оба приведенных ниже метода работают так же далеко, как и при копировании значений, но оба выдают это предупреждение.

Если это имеет значение, столбец A получается из операции read_csv, а столбец B вставляется позже.

В основномЯ хотел бы получить отзыв о том, какой путь лучше, или если есть способ сделать это, чтобы предупреждение не сработало.

for row in df.itertuples():
    df['columnB'] = df['columnA']

df['columnB'] = df.apply(lambda row: row['columnA'], axis=1)

1 Ответ

2 голосов
/ 05 марта 2019

Давайте посмотрим на это внимательно.

Сначала давайте создадим фрейм данных 5x5.

df = pd.DataFrame(np.arange(25).reshape(5,-1), index=[*'abcde'], columns=[*'ABCDE'])
df

Выход:

    A   B   C   D   E  
a   0   1   2   3   4  
b   5   6   7   8   9 
c  10  11  12  13  14 
d  15  16  17  18  19 
e  20  21  22  23  24 

Давайте создадим новый столбец из старого:

df['Z'] = df['A']
df

Выход:

    A   B   C   D   E   Z
a   0   1   2   3   4   0
b   5   6   7   8   9   5
c  10  11  12  13  14  10
d  15  16  17  18  19  15
e  20  21  22  23  24  20

Примечание: нет SettingWithCopyWarnings

Теперь давайте возьмем копию df с именем df_1 и изменим ячейку в df_1, что происходит с df?:

df_1 = df
df_1.loc['a','A'] = 100
print(df_1)
print('\n')
print(df)

Выход:

     A   B   C   D   E   Z
a  100   1   2   3   4   0
b    5   6   7   8   9   5
c   10  11  12  13  14  10
d   15  16  17  18  19  15
e   20  21  22  23  24  20

     A   B   C   D   E   Z
a  100   1   2   3   4   0
b    5   6   7   8   9   5
c   10  11  12  13  14  10
d   15  16  17  18  19  15
e   20  21  22  23  24  20

Примечание: df также изменен!

Теперь давайте возьмем подмножество df, назвав его df_ac:

 df_ac = df['a':'c']
 df_ac

Выход:

     A   B   C   D   E   Z
a  100   1   2   3   4   0
b    5   6   7   8   9   5
c   10  11  12  13  14  10

Давайте изменим значение в df_ac и посмотрим, что произойдет:

df_ac['X'] = df['B']

Сначала мы получаем SettingWithCopyWarning. Что это значит? Ну, это означает, что в этом случае df не изменился.

df_ac

Выход:

     A    B   C   D   E   Z    X
a  100    1   2   3   4   0    1
b    5    6   7   8   9   5    6
c   10   11  12  13  14  10   11

Однако выведите df,

     A    B   C   D   E   Z
a  100    1   2   3   4   0
b    5    6   7   8   9   5
c   10   11  12  13  14  10
d   15   16  17  18  19  15
e   20   21  22  23  24  20

Одним из способов избежать этого предупреждения является использование `copy '

df_ac = df['a':'c'].copy()
df_ac['X'] = df_ac['B']

Нет, SettingWithCopyWarning.

...