【问题标题】:adding new pandas series and setting to false添加新的熊猫系列并设置为 false
【发布时间】:2021-04-18 20:44:51
【问题描述】:

我正在添加以下代码:

 r = df_1[~df_1isin(
        df_2.to_dict('list')).all(1)] 
 r['is_sent'] = pd.Series(False).bool()

目的是缩小两个数据框之间的搜索范围,然后我想添加一个新列(pd.series)并将这些发现设置为 false。这符合我的意图,但返回了一条消息:

"试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value"

谁能解释这个引用的内容并举例说明正确的方法是什么?

【问题讨论】:

    标签: python-3.x pandas dataframe series


    【解决方案1】:

    这个问题是切片 DataFrame 会在切片和原始 DataFrame 之间创建一个weakref。这会在您进行分配时触发下一行的警告。

    import pandas as pd
    
    df = pd.DataFrame([0,1,1,1,2])
    r = df[df.isin([1]).all(1)]
    
    r['new_col'] = False
    #<ipython-input-210-d5f9bda478c4>:9: SettingWithCopyWarning:  ...
    

    您可以使用内置方法._is_copy 验证是否存在弱引用

    df = pd.DataFrame([0,1,1,1,2])
    r = df[df.isin([1]).all(1)]
    r._is_copy
    #<weakref at 0x142b10e00; to 'DataFrame' at 0x14361ed00>
    

    而打破这一点最简单的方法是使用.copy() 强制进行深层复制,使rdf 没有任何关系,从而消除警告。

    r = df[df.isin([1]).all(1)].copy()
    r._is_copy
    #None
    
    r['new_col'] = False
    # No warning!
    

    最后,这个警告经常似乎被击中或错过,但这是因为许多pandas操作返回一个新对象,所以如果切片和分配很可能这些操作本身会破坏弱引用,从而阻止警告。例如,像乘以 2 这样的简单操作会创建一个新对象,而您不会收到任何警告。

    df = pd.DataFrame([0,1,1,1,2])
    
    r = df[df.isin([1]).all(1)]
    print(r._is_copy)
    #<weakref at 0x13e6ad0e0; to 'DataFrame' at 0x1436227c0>
    
    r = r*2   # Breaks the reference
    print(r._is_copy)
    # None
    
    r['new_col'] = False
    # No warning!
    

    【讨论】:

    • 嗨,我非常感谢这里的彻底回答。这是有道理的!
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2021-10-16
    • 2022-01-26
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2022-01-23
    • 2020-01-23
    相关资源
    最近更新 更多