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'的最后一次出现更改为'Falsemask[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