【问题标题】:Copy values between pandas dataframe columns在熊猫数据框列之间复制值
【发布时间】:2019-03-05 12:58:30
【问题描述】:

我昨天花了很多时间试图将 pandas 数据帧的一列 (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)

【问题讨论】:

    标签: python pandas iteration lambda


    【解决方案1】:

    让我们仔细看看。

    首先,让我们创建一个 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。

    【讨论】:

    • 很好的解释!它让我弄清楚了。我的数据框 df 是一个名为数据的副本 - df = data.loc[data['columnC'] == X],而不是从一开始就使用 df - df = df.loc[df['columnC'] == X]
    • 谢谢你,@recurvata。编码愉快。
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2015-08-09
    • 2022-12-15
    • 2020-09-01
    • 2020-07-07
    相关资源
    最近更新 更多