熊猫:什么时候可以直接赋值给数组

时间:2016-09-26 01:15:10

标签: python pandas

我在翻译中弄乱了大熊猫,以下行为让我感到惊讶:

>>> data = [[1.0, np.nan], [2.0, -17.0]]
>>> f = pd.DataFrame(data)
>>> f
     0     1
0  1.0   NaN
1  2.0 -17.0
>>> f.values[1, 1] = -99.0
>>> f
     0     1
0  1.0   NaN
1  2.0 -99.0

我无法使用values属性直接分配给基础数组。但是,如果我明确地从浮动开始,我可以:

 //Print PDF
        System.Net.WebClient client = new System.Net.WebClient();
        Byte[] buffer = client.DownloadData(filePath);
        Process.Start(filePath);

是否有人知道可以让我预测这个的规则?我觉得我必须遗漏一些明显的东西。

2 个答案:

答案 0 :(得分:1)

Pandas不保证何时df.values的作业会影响df,因此我建议从不尝试通过df修改df.values。如何以及何时工作是一个实现细节。如StevenG states所示,使用df.iloc[1,1] = -99在序数索引指定的位置指定新值,或使用df.set_value在索引标签指定的位置指定新值。

在幕后,df将其值存储在“块”中。块被隔离 dtype,尽管有时多个块可以具有相同的dtype。中的数据 每个块都存储在NumPy数组中。

使用时

df2 = pd.DataFrame([[1, np.nan], [2, -17]])

第一列具有整数dtype,而第二列具有浮点dtype。

In [27]: df2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 2 columns):
0    2 non-null int64
1    1 non-null float64
dtypes: float64(1), int64(1)
memory usage: 112.0 bytes

当您访问df2.values属性时,会返回一个同源dtype的单个 NumPy数组。什么时候 df2包含不同dtypes的列,Pandas必须将dtypes提升为a 单一共同的dtype。在最坏的情况下,常见的dtype可能是object。在这 case,整数被提升为浮点dtype。

In [28]: df2.values.dtype
Out[28]: dtype('float64')

dtype促销要求来自各个块的基础数据 复制到新的NumPy数组中。因此,修改返回的副本 df2.values不会影响df2中的原始数据。

相反,如果DataFrame的数据完全是一个dtype,那么f.values 返回原始数据的视图。所以在这种特殊情况下,修改 f.values影响f本身。

总而言之,当DataFrame包含多个块时,df.values将是一个 df中的数据副本。修改df.values中的副本不会影响 df

由于DataFrame有时会有多个相同dtype 的块,甚至 如果DataFrame中的所有数据都具有相同的dtype,df.values可能仍然是 副本。

如果您致电df.consolidate(),则每个dtype的数据将组合在一起 在单个NumPy数组中。因此,如果您的DataFrame数据包含单个dtype, 然后您先调用df.consolidate(),然后修改df.values将进行修改 df

答案 1 :(得分:0)

使用.values返回一个numpy数组。所以无论你做df.values之后做什么,都会像使用numpy数组一样。

使用df.iloc[i,i]允许您使用整数位置设置值或提取值