【问题标题】:A dict of pandas dataframes: how to know if referencing a copy of the dataframe in the dict or the dataframe inside the dict?Pandas 数据帧的字典:如何知道是引用字典中的数据帧副本还是字典内的数据帧?
【发布时间】:2016-07-12 06:20:56
【问题描述】:

您好,我遇到了一些我无法解释的有趣行为。

我有一个名为 combineDict 的字典。它有字符串键,它的元素是熊猫数据框。

我想选择名为“early”的数据框。我创建了一个变量 a 等于该数据框。然后,我想通过将字符串“_early”附加到该列的每一行来编辑该数据框中的 ID 列。我使用以下代码执行此操作:

a = combinedDict['early']
a['ID'] = [(s + '_early') for s in a['ID'].tolist()]

当我这样做时,字符串 '_early' 被附加到数据帧 a 中列的每一行,但它也被附加到存储在 combineDict['early'] 中的数据帧的每一行。

另一方面,当我使用以下代码添加 .copy() 时,只有数据帧 a 受到影响,而存储在 combineDict['early'] 中的数据帧不受影响。这是我第一次遇到这种行为。这只是 pandas 数据框的一个特性吗?

【问题讨论】:

    标签: python dictionary pandas


    【解决方案1】:

    让我们试试这个:

    In [87]: df1 = pd.DataFrame({'a': [1,2,3,4,5,6,7,8,9]})
    
    In [88]: df1
    Out[88]:
       a
    0  1
    1  2
    2  3
    3  4
    4  5
    5  6
    6  7
    7  8
    8  9
    
    In [89]: df2 = df1
    
    In [90]: id(df1) == id(df2)
    Out[90]: True
    
    In [91]: df2.ix[df2.a > 4, 'a'] = 0
    
    In [92]: df1
    Out[92]:
       a
    0  1
    1  2
    2  3
    3  4
    4  0
    5  0
    6  0
    7  0
    8  0
    

    所以您的acombinedDict['early']引用

    这是documentation的摘录:

    数据的可变性和复制

    所有的 pandas 数据结构都是 值可变(它们包含的值可以更改)但并非总是如此 大小可变。 Series 的长度不能改变,但是,对于 例如,列可以插入到 DataFrame 中。然而,广大 大多数方法产生新对象并留下输入数据 原封不动。不过,总的来说,我们喜欢支持不变性,其中 明智的。

    【讨论】:

    • 我想我明白了。绝大多数 pandas 方法都会创建一个新对象,但在这种情况下会创建一个引用?
    • @pvt,是的,比较 id( combinedDict['early'] )id( a ) 可以让您知道它是参考还是复制
    猜你喜欢
    • 2016-04-28
    • 2015-08-31
    • 2020-08-22
    • 1970-01-01
    • 2021-03-22
    • 2016-04-15
    • 2022-08-05
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多