Python 更改多索引数据帧中的特定列值
假设我们有以下数据帧Python 更改多索引数据帧中的特定列值,python,pandas,multi-index,Python,Pandas,Multi Index,假设我们有以下数据帧 myDF = DataFrame(np.random.randn(4,2), index= [[1,1,2,2],['Mon','Tue','Mon','Tue']]) myDF 0 1 1 Mon -0.910930 1.592856 Tue -0.167228 -0.763317 2 Mon -0.926121 -0.718729 Tue 0.372288 -0.417337
myDF = DataFrame(np.random.randn(4,2), index= [[1,1,2,2],['Mon','Tue','Mon','Tue']])
myDF
0 1
1 Mon -0.910930 1.592856
Tue -0.167228 -0.763317
2 Mon -0.926121 -0.718729
Tue 0.372288 -0.417337
如果要更改索引1中所有行的第一列的值,请尝试执行以下操作:
myDF.ix[1,:][0] = 99
但这不起作用,并返回相同的数据帧不变。我错过了什么。
谢谢你当你尝试这样的东西时,熊猫的最新版本会给你一个警告。例如,在版本0.13.1上,您将得到以下结果:
In [4]: myDF.ix[1,:][0] = 99
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
你所做的被称为,但由于熊猫依赖的numpy内部工作的微妙性,它失败了
您的情况比general warning解决的情况更复杂,因为您有一个多索引。要选择外层标签为1
且列标签为0
的所有行,请使用.loc[1,0]
。(另请参见。)
当你尝试这样的东西时,熊猫的最新版本会给出警告。例如,在版本0.13.1上,您将得到以下结果:
In [4]: myDF.ix[1,:][0] = 99
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
你所做的被称为,但由于熊猫依赖的numpy内部工作的微妙性,它失败了
您的情况比general warning解决的情况更复杂,因为您有一个多索引。要选择外层标签为1
且列标签为0
的所有行,请使用.loc[1,0]
。(另请参见。)
我相信,我们可以通过以下方式实现真正的灵活性:
index = [idx for idx, vals in enumerate(myDF.index.values) if vals[1] in ['Mon','Wed'] and vals[0] in [2,3,4]]
colums = [0,1]
myDF.iloc[index, columns] = 99
从for循环创建索引不是最有效的方法,因此可以创建一个字典,其中键是多索引元组,值是索引
通过这种方式,我们可以指定要更改两个索引级别中的哪些值。
.xs()执行类似的操作,但不能通过该函数更改值
如果有一个更简单的方法,我真的很想找到它。我相信我们可以通过使用以下方法获得真正的灵活性:
index = [idx for idx, vals in enumerate(myDF.index.values) if vals[1] in ['Mon','Wed'] and vals[0] in [2,3,4]]
colums = [0,1]
myDF.iloc[index, columns] = 99
从for循环创建索引不是最有效的方法,因此可以创建一个字典,其中键是多索引元组,值是索引
通过这种方式,我们可以指定要更改两个索引级别中的哪些值。
.xs()执行类似的操作,但不能通过该函数更改值
如果有更简单的方法,我真的很想找到答案。您在数据帧上使用过.update()吗?不,更新做了一些非常不同的事情。它将另一个数据帧作为参数。您是否尝试在该数据帧上使用.update()?不,更新做了一些非常不同的事情。它将另一个数据帧作为参数。我希望更改列中特定索引的所有值。“1月0日”(0.214686)未更改为99。有什么解决办法吗?我明白了。您需要
.loc
(基于标签)而不是.iloc
(基于位置)。我相应地编辑了答案。我想更改列中特定索引的所有值。“1月0日”(0.214686)未更改为99。有什么解决办法吗?我明白了。您需要.loc
(基于标签)而不是.iloc
(基于位置)。我据此编辑了答案。