【问题标题】:applymap function on a df.copy() changing the original dataframe valuesdf.copy() 上的 applymap 函数更改原始数据帧值
【发布时间】:2021-09-01 16:52:13
【问题描述】:

我有一个名为 results 的 pandas 数据框,其中包含 2 列,一列名为 years 包含年份列表,另一列名为 line_items 包含整数列表。我正在尝试在名为dfcopy 的原始数据帧的副本中对列表值进行排序,但这样它就不会更改原始数据帧。两个可重现的df是这样的:

results = {'years': {0: ['2020', '2021'], 1: ['2019', '2020'], 2: ['2020', '2021'], 3: ['2019', '2020'], 4: ['2019', '2020']}, 'line_items': {0: ['3818', '4121'], 1: ['105', '154'], 2: ['1030', '942'], 3: ['4681', '4849'], 4: ['3439', '3656']}}

dfcopy = results[['years', 'line_items']].copy()

我在dfcopy 上使用applymap 对正在更改results 的列表进行排序。这对我来说毫无意义,因为我的理解和.copy() 的文档都表明这不会改变原始数据框。这是我的代码:

dfcopy.applymap(lambda x: x.sort())

谁能帮我理解为什么会这样。 (PS 我知道我可以做 results.copy() 但这不应该改变 .copy() 函数的功能)

【问题讨论】:

    标签: python pandas copy python-applymap


    【解决方案1】:

    因为lambda x: x.sort() 就地改变列表对象

    并且.copy 不会复制恰好在数据框中的python 对象,如果您将deep=True 传递给df.copy,这甚至不会发生。

    一般来说,pandas 的设计目的不是在数据框中包含列表。

    【讨论】:

    • 我很困惑.copy() 是干什么用的?
    • @geds133 它复制数据帧copy(deep=False) 不会复制底层缓冲区,但 copy(deep=True) 会。但是,即使您复制底层缓冲区,当您将列表放入数据帧时,dtype 必须是object。这基本上只是意味着指向 python 对象的指针。真的,您可能不想在数据框中使用列表
    • @geds133 不管怎样,你可以做dfcopy.applymap(sorted)
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多