Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 基于整数和索引标签的混合为多索引数据帧赋值_Python 2.7_Pandas - Fatal编程技术网

Python 2.7 基于整数和索引标签的混合为多索引数据帧赋值

Python 2.7 基于整数和索引标签的混合为多索引数据帧赋值,python-2.7,pandas,Python 2.7,Pandas,我有一个带有多索引列的数据帧。我希望根据列名在第一级进行选择,然后返回除最后一列之外的所有列,并为所有这些元素指定一个新值 下面是一个示例数据帧: In [1]: mydf = pd.DataFrame(np.random.random_integers(low=1,high=5,size=(4,9)), columns = pd.MultiIndex.from_product([['A', 'B', 'C'], ['a', 'b', 'c']]))

我有一个带有多索引列的数据帧。我希望根据列名在第一级进行选择,然后返回除最后一列之外的所有列,并为所有这些元素指定一个新值

下面是一个示例数据帧:

In [1]: mydf = pd.DataFrame(np.random.random_integers(low=1,high=5,size=(4,9)), 
                   columns = pd.MultiIndex.from_product([['A', 'B', 'C'], ['a', 'b', 'c']]))


Out[1]:
    A           B           C
    a   b   c   a   b   c   a   b   c
0   4   1   2   1   4   2   1   1   3
1   4   4   1   2   3   4   2   2   3
2   2   3   4   1   2   1   3   2   3
3   1   3   4   2   3   4   1   5   1
例如,如果希望能够分配给此元素:

In [2]: mydf.loc[:,('A')].iloc[:,:-1]

Out[2]:
    A    
    a   b 
0   4   1 
1   4   4   
2   2   3   
3   1   3 
如果我只想修改一列,我知道如何使用元组正确地选择它,以便赋值工作:

In [3]: mydf.loc[:,('A','a')] = 0

In [4]: mydf.loc[:,('A','a')]

Out[4]:

0    0
1    0
2    0
3    0
Name: (A, a), dtype: int32
所以这很有效

现在,以下内容不起作用

In [5]: mydf.loc[:,('A')].ix[:,:-1] = 6 - mydf.loc[:,('A')].ix[:,:-1]

In [6]: mydf.loc[:,('A')].iloc[:,:-1] = 6 - mydf.loc[:,('A')].iloc[:,:-1]
有时我会,有时我不会,得到一个警告,一个值正试图在一个数据帧的切片副本上设置。但在这两种情况下,它实际上并没有赋值

我已经尝试了我所能想到的一切,我仍然不知道如何混合标签和整数索引来正确设置值。 有什么想法吗


版本:

  • Python 2.7.9
  • 熊猫0.16.1

    • 这不受直接支持,因为
      。loc
      必须有标签,而不是位置。理论上,
      .ix
      可以通过多索引切片器支持这一点,但通常很难弄清楚用户的“意思”(例如,它是标签还是位置)

      所以我们计算A块的索引器
      np.r
      将此切片转换为实际的索引器;然后我们选择元素(例如,在本例中为0)。这将输入到
      .iloc

      In [65]: df.iloc[:,np.r_[df.columns.get_loc('A')][0]] = 0
      
      In [66]: df
      Out[66]: 
         A        B        C      
         a  b  c  a  b  c  a  b  c
      0  0  4  4  4  3  2  5  1  4
      1  0  2  1  3  2  1  1  4  5
      2  0  2  4  4  2  2  3  1  4
      3  0  1  1  3  1  1  5  5  5
      

      我试着修改你的答案,让它成为一个关于修改两列的例子,就像我问的那样(其中一列的
      df.loc[:,('A','A')]
      工作起来很有魅力)
      df.iloc[:,np.r.[df.columns.get_loc('A')][:-1]]
      适用于虚拟情况,但在我的实际数据帧上不适用。我研究了np.r_,它生成了一个完整的真/假数组。如何将列表中最后一个True更改为False?找到它:
      mask=np.r[df.columns.get\u loc('a')]
      将'True'的最后一次出现更改为'False
      mask[np.where(mask==True)[0][1:]=False
      为这些
      df.iloc[:,mask]赋值=0
      @Jeff这是在同一命令中混合位置和标签切片的唯一方法吗?你想按位置切片行,按标签切片列?是的,这是唯一的方法——混合像ix这样的东西只会导致confusion@Jeff,一种更惯用的方法是(在选择而不是赋值时),
      df.loc[:,'label'].iloc[4:,:]
      ?也就是说,按标签指定列,然后按索引指定行?
      In [65]: df.iloc[:,np.r_[df.columns.get_loc('A')][0]] = 0
      
      In [66]: df
      Out[66]: 
         A        B        C      
         a  b  c  a  b  c  a  b  c
      0  0  4  4  4  3  2  5  1  4
      1  0  2  1  3  2  1  1  4  5
      2  0  2  4  4  2  2  3  1  4
      3  0  1  1  3  1  1  5  5  5