我之前已经问了一个相关的问题,但我不想开始评论和编辑讨论。所以在这里 - 沸腾了 - 我之前的问题的答案引导我问。考虑
import pandas as pd
from numpy import arange
from scipy import random
index = pd.MultiIndex.from_product([arange(0,3), arange(10,15)], names=['A', 'B'])
df = pd.DataFrame(columns=['test'], index=index)
someValues = random.randint(0, 10, size=5)
df.loc[0, 'test']
,df.loc[0,:]
和df.ix[0]
都创建了数据框的一部分的表示,第一个是系列,另外两个是df切片。然而
df.ix[0] = df.loc[0,'test'] = someValues
设置df df.loc[0,'test'] = someValues
发出错误ValueError: total size of new array must be unchanged
df.loc[0,:] = someValues
被忽略了。没有错误,但是df不包含numpy数组。我浏览了文档,但对于MultiIndexes的一般情况,没有明确的逻辑和系统的解释。到目前为止,我猜这个"如果视图是一个系列,你可以设置值"和"否则,上帝知道会发生什么"。
有人能否对逻辑有所了解?此外,这背后是否有一些深层含义,或者由于它是如何设置的,这些只是限制因素?
答案 0 :(得分:2)
这些都是0.13.1
这些不是全部'切片'完全代表。
这是一个系列。
In [50]: df.loc[0,'test']
Out[50]:
B
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
Name: test, dtype: object
这些是DataFrames(和相同的)
In [51]: df.loc[0,:]
Out[51]:
test
B
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
[5 rows x 1 columns]
In [52]: df.ix[0]
Out[52]:
test
B
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
[5 rows x 1 columns]
这是试图分配错误的形状(它看起来应该有效,但是如果你有多个列那么它就赢了,这就是不允许这样做的原因)
In [54]: df.ix[0] = someValues
ValueError: could not broadcast input array from shape (5) into shape (5,1)
这是有效的,因为知道如何广播
In [56]: df.loc[0,:] = someValues
In [57]: df
Out[57]:
test
A B
0 10 4
11 3
12 4
13 2
14 8
1 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
2 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
[15 rows x 1 columns]
这很好用
In [63]: df.loc[0,'test'] = someValues+1
In [64]: df
Out[64]:
test
A B
0 10 5
11 4
12 5
13 3
14 9
1 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
2 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
[15 rows x 1 columns]
就像这样
In [66]: df.loc[0,:] = someValues+1
In [67]: df
Out[67]:
test
A B
0 10 5
11 4
12 5
13 3
14 9
1 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
2 10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
[15 rows x 1 columns]
不清楚您在问题中生成案例的位置。我认为逻辑非常简单和一致(但是在先前的版本中它们有几个不一致)。