【问题标题】:Does np.array's astype prevent future edits in DataFrames?np.array 的 astype 是否会阻止将来在 DataFrames 中进行编辑?
【发布时间】:2013-03-11 15:03:31
【问题描述】:

我最初可以更改 DataFrame 的第一个条目:

In [6]: df = pd.DataFrame(np.random.rand(5,2))
In [7]: df
Out[7]:
          0         1
0  0.514592  0.459589
1  0.329704  0.409099
2  0.061246  0.966191
3  0.336747  0.908513
4  0.169220  0.468437

In [8]: df.ix[0][0] = 1
In [9]: df
Out[9]:
          0         1
0  1.000000  0.459589
1  0.329704  0.409099
2  0.061246  0.966191
3  0.336747  0.908513
4  0.169220  0.468437

但是在我这样做之后:

In [10]: df[0] = np.floor(df.index / 10).astype(int) * 10
In [11]: df
Out[11]:
   0         1
0  0  0.459589
1  0  0.409099
2  0  0.966191
3  0  0.908513
4  0  0.468437

我找不到改变它的方法。

In [12]: df.ix[0][0] = 1
In [13]: df
Out[13]:
   0         1
0  0  0.459589
1  0  0.409099
2  0  0.966191
3  0  0.908513
4  0  0.468437

而且我什至无法更改其他列中的元素

In [16]: df.ix[0][1] = 1

In [17]: df
Out[17]:
   0         1
0  0  0.459589
1  0  0.409099
2  0  0.966191
3  0  0.908513
4  0  0.468437

这是怎么回事?

【问题讨论】:

    标签: numpy dataframe pandas


    【解决方案1】:

    您正在编辑副本,请尝试

    In [3]: df = pd.DataFrame(np.random.rand(5,2))
    
    In [4]: df[0] = np.floor(df.index / 10).astype(int) * 10
    
    In [5]: df
    Out[5]: 
       0         1
    0  0  0.201611
    1  0  0.390364
    2  0  0.727422
    3  0  0.941035
    4  0  0.036764
    
    In [6]: df.ix[0,1] = 1
    
    In [7]: df
    Out[7]: 
       0         1
    0  0  1.000000
    1  0  0.390364
    2  0  0.727422
    3  0  0.941035
    4  0  0.036764
    

    【讨论】:

    • 有趣,那么.ix 是唯一改变它的方法吗?你知道为什么用[colname]单独访问列只会得到一个副本吗?
    • [] 对 DataFrame 中的行进行切片,请参阅 pandas.pydata.org/pandas-docs/dev/indexing.html#basics,colname 访问是一种便利功能,它将底层系列作为副本返回,请参阅 pandas.pydata.org/pandas-docs/dev/basics.html#copying
    • 但是为什么 colname 访问会在 astype 分配之前使用输入 8 和 10 更改 df,如果 colname 访问仅返回一个副本,但之后不会更改 df(输入12 & 16)?
    • 嗯,也许这取决于 numpy 想要做什么pandas.pydata.org/pandas-docs/dev/…
    • .ix 将返回视图或副本,取决于 numpy,这实际上意味着内存中的布局是问题所在。在 astype 之前,这是一个单一的 dtype,所以是一个内存块,所以你得到一个视图,在 astype 之后,一些东西被复制(通过 numpy),所以你不能再得到一个视图,所以你得到一个副本,很奇怪,但它不提供“保证”。如果您使用 ix[row,col] = value 语法,您可以避免整个问题(或在 0.11、loc[row,col]iloc[row_number,col_number] 中。HTH
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多