在熊猫数据框列之间复制值

时间:2019-03-05 12:58:31

标签: python pandas iteration lambda

昨天我花了大量时间试图将熊猫数据框的一个列(columnA)中的值复制到同一数据框中的另一列(columnB)中。这些列是带有数字和NaN值的浮点数。

我研究了该站点,Stack Overflow,Google等,但我尝试的所有操作均失败,什么都不做和/或给了我SettingWithCopyWarning警告。下面的两种方法都可以复制值,但都会发出此警告。

如果有所作为,则columnA来自read_csv操作,而columnB稍后插入。

基本上,我希望获得一些反馈,以了解哪种方法更好,或者是否有一种方法可以使警告不被触发。

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

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

1 个答案:

答案 0 :(得分:2)

让我们仔细看看。

首先,我们创建一个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_1的df副本,并在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

避免此警告的一种方法是使用“复制”

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

否,SettingWithCopyWarning。