我在翻译中弄乱了大熊猫,以下行为让我感到惊讶:
>>> 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);
是否有人知道可以让我预测这个的规则?我觉得我必须遗漏一些明显的东西。
答案 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]
允许您使用整数位置设置值或提取值