多索引数据框:设置值

时间:2014-05-20 15:37:58

标签: python numpy pandas

我之前已经问了一个相关的问题,但我不想开始评论和编辑讨论。所以在这里 - 沸腾了 - 我之前的问题的答案引导我问。考虑

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的一般情况,没有明确的逻辑和系统的解释。到目前为止,我猜这个"如果视图是一个系列,你可以设置值"和"否则,上帝知道会发生什么"。

有人能否对逻辑有所了解?此外,这背后是否有一些深层含义,或者由于它是如何设置的,这些只是限制因素?

1 个答案:

答案 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]

不清楚您在问题中生成案例的位置。我认为逻辑非常简单和一致(但是在先前的版本中它们有几个不一致)。