Python 熊猫:使用(行、列)索引设置值

Python 熊猫:使用(行、列)索引设置值,python,pandas,Python,Pandas,pandas提供了通过行和列索引列表进行查找的功能 In [49]: index = ['a', 'b', 'c', 'd'] In [50]: columns = ['one', 'two', 'three', 'four'] In [51]: M = pandas.DataFrame(np.random.randn(4,4), index=index, columns=columns) In [52]: M Out[52]: one two thr

pandas提供了通过行和列索引列表进行查找的功能

In [49]: index = ['a', 'b', 'c', 'd']

In [50]: columns = ['one', 'two', 'three', 'four']

In [51]: M = pandas.DataFrame(np.random.randn(4,4), index=index, columns=columns)

In [52]: M
Out[52]: 
        one       two     three      four
a -0.785841 -0.538572  0.376594  1.316647
b  0.530288 -0.975547  1.063946 -1.049940
c -0.794447 -0.886721  1.794326 -0.714834
d -0.158371  0.069357 -1.003039 -0.807431

In [53]: M.lookup(index, columns) # diagonal entries
Out[53]: array([-0.78584142, -0.97554698,  1.79432641, -0.8074308 ])

我想使用同样的索引方法来设置M的元素。我怎样才能做到这一点呢?

我不确定我是否理解您的意思,但您是否使用DataFrame.ix来选择/设置各个元素:

In [79]: M
Out[79]: 
        one       two     three      four
a -0.277981  1.500188 -0.876751 -0.389292
b -0.705835  0.108890 -1.502786 -0.302773
c  0.880042 -0.056620 -0.550164 -0.409458
d  0.704202  0.619031  0.274018 -1.755726

In [75]: M.ix[0]
Out[75]: 
one     -0.277981
two      1.500188
three   -0.876751
four    -0.389292
Name: a

In [78]: M.ix[0,0]
Out[78]: -0.27798082190723405

In [81]: M.ix[0,0] = 1.0

In [82]: M
Out[82]: 
        one       two     three      four
a  1.000000  1.500188 -0.876751 -0.389292
b -0.705835  0.108890 -1.502786 -0.302773
c  0.880042 -0.056620 -0.550164 -0.409458
d  0.704202  0.619031  0.274018 -1.755726

In [84]: M.ix[(0,1),(0,1)] = 1

In [85]: M
Out[85]: 
        one       two     three      four
a  1.000000  1.000000 -0.876751 -0.389292
b  1.000000  1.000000 -1.502786 -0.302773
c  0.880042 -0.056620 -0.550164 -0.409458
d  0.704202  0.619031  0.274018 -1.755726
您还可以按索引进行切片:

In [98]: M.ix["a":"c","one"] = 2.0

In [99]: M
Out[99]: 
        one       two     three      four
a  2.000000  1.000000 -0.876751 -0.389292
b  2.000000  1.000000 -1.502786 -0.302773
c  2.000000 -0.056620 -0.550164 -0.409458
d  0.704202  0.619031  0.274018 -1.755726

自从这个答案被写下来已经好几年了,所以我想我可能会贡献一点。通过熊猫的重构,尝试在具有

M.iloc[index][col]
可能会给您一个关于尝试在切片中设置值的警告

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
在0.21之后的pandas版本中,正确的Python方式现在是

看起来是这样的:

M.at[index,col] = new_value
旧版本的答案: 在较旧的版本中,更具Python风格的方法是使用指令。请注意,此指令返回生成的数据帧

M.set_value(index,column,new_value)
我只是想在弄清楚可以由.iloc或.ix方法生成的警告的来源之后,我会在这里发布这篇文章


set_-value方法也适用于多索引数据帧,方法是将多个级别的索引作为元组放入,例如,用col、subcol替换column,这将设置单个元素,但给定行、索引、值对的列表,有没有简单的方法可以一次设置它们?我认为没有,您需要迭代行,逐个索引、值元组和设置值。如果您有三个列表索引标签、列标签、值,那么这看起来像是M.set标签、列标签、值的todo扩展。另一个选项是使用M.update,但这里您需要首先构造一个不同的框架。您可以将一个元组/列表传递到ix中,以设置数据框架中的值。请参见上面的编辑。例如,M.ix[0,1,0,1]=1这是一件非常有用的事情,我来这里只是想知道如何做!,但不幸的是,它不允许我像最初希望的那样设定价值观。谢谢从0.20.0开始,.ix索引器被弃用,取而代之的是更严格的.iloc和.loc索引器。感谢您发布这篇文章,今天我在一所主要大学的数据科学课上的教授告诉我,制作副本并对数据帧的整列进行操作比使用apply一次修改一个值更好——不管怎样,前一个选项都可以!在这个答案中有一个真正的教育,一个人就是付不起哈哈。您提供的链接很好:也是离题的,但有趣的是,由于版本0.21.0,设置值已被弃用:请改用.at[]或.iat[]访问器@JimLohse-谢谢,更新了主要答案,因为人们似乎仍然可以找到该页面。关于由于使用而导致的CopyWarning设置。我的理解是,当您打算覆盖原始数据帧时,可以安全地忽略它。有关详细信息,请参阅。的可能重复项