【问题标题】:Replacing existing column in dask map_partitions gives SettingWithCopyWarning替换 dask map_partitions 中的现有列会给出 SettingWithCopyWarning
【发布时间】:2022-08-06 12:22:13
【问题描述】:

我正在使用map_partitions 替换dask 数据框中的id2 列。结果是这些值被替换但带有pandas 警告。

这是什么警告以及如何在下面的示例中应用 .loc 建议?

pdf = pd.DataFrame({
    \'dummy2\': [10, 10, 10, 20, 20, 15, 10, 30, 20, 26],
    \'id2\': [1, 1, 1, 2, 2, 1, 1, 1, 2, 2],
    \'balance2\': [150, 140, 130, 280, 260, 150, 140, 130, 280, 260]
})

ddf = dd.from_pandas(pdf, npartitions=3) 

def func2(df):
    df[\'id2\'] = df[\'balance2\'] + 1
    return df

ddf = ddf.map_partitions(func2)

ddf.compute()

C:\\Users\\xxxxxx\\AppData\\Local\\Temp\\ipykernel_30076\\248155462.py:2: SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的是价值

请参阅文档中的警告: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df[\'id2\'] = df[\'balance2\'] + 1

    标签: python pandas dataframe dask dask-dataframe


    【解决方案1】:

    一个快速的解决方法是添加数据框的副本:

    def func2(df):
        df = df.copy() # will make a copy of the dataframe
        df['id2'] = df['balance2'] + 1
        return df
    

    但是,据我了解,不需要复制数据帧,因为 dask 数据帧的延迟性质意味着更改不会传播回 dask 数据帧分区。

    更新:有一个relevant question 解释了pandas.copy 的原因。在下面的 sn-p 中,应用该函数将修改原始 pandas 数据帧,这可能是不可取的:

    from pandas import DataFrame
    
    def addcol(df):
        df['a'] = 1
        return df
    
    df = DataFrame()
    
    df1 = addcol(df)
    # without .copy, df is also modified, which might be undesirable
    

    dask 的上下文中,这个警告只是一个警告,所以不需要.copy

    from dask.dataframe import from_pandas
    ddf = from_pandas(df, npartitions=1)
    ddf1 = ddf.map_partitions(addcol)
    # will show warning, but original ddf is not modified
    

    【讨论】:

    • 通过复制数据框可以实现什么?
    • 如果您使用的是 pandas 数据帧,那么运行原始的 func2 将修改传递给 func2 的数据帧(即输入数据帧和输出数据帧都将被修改)。
    • 这行得通,但是我仍然很困惑什么时候应该复制数据框,什么时候不应该。
    • 好的,因此使用副本创建新引用将删除警告,我明白了,但您还说“不需要副本”?
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多