使用pandas loc/iloc/at/iat/ix获取标量值

2024-03-28 14:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:df1和df2。我使用iterrows迭代df1,对于每一行中的特定字段,我在df2中查找与该字段匹配的行,并尝试以标量格式从df2中的该行中提取相应的值。每次我尝试这样做,最终都会得到另一个数据帧或序列,但我不能将该值用作标量。这是我最近的尝试:

for index, row in df1.iterrows():
    a = row[0]
    b = df2.loc[(df2['name'] == a ), 'weight']
    c = row[1] - b   #this is where error happens
    df1.set_value(index,'wtdif',c)

我得到了一个错误,因为在这个例子中'b'不是标量,如果我把它打印出来,这是它的一个例子。这里的'24'是它在df2中找到的行的索引。另一个令人困惑的地方是,我不能以任何方式索引“b”,即使它是一个序列(例如,b[0]创建了一个错误,b['weight']也是如此)

^{pr2}$

Tags: 数据inforindex格式错误序列loc
2条回答

您得到了一个错误,因为b中的唯一索引是24。你可以使用这个或者(更容易)使用位置索引

b.iloc[0]

对于新熊猫用户来说,这是一个常见的问题。从序列或数据帧中提取数据时,索引将被保留。一般来说,它们不是从0->;N-1运行,其中N是序列的长度或数据帧中的行数。在

这会有点帮助,尽管我承认一开始也让我感到困惑。在

嗯,当我对我的代码进行更改时,我仍然得到“IndexError:single positional indexer is outbounds”。在

你的建议很有道理,也很管用,谢谢你的发帖。我写了一个快速测试脚本来验证修复,它确实起到了很好的作用。我会把代码贴在这里,以防有人好奇。在

我在这里遗漏了一些东西,我只需要继续研究到底是什么错了,我的下一个问题应该是什么。。。在

import pandas as pd
import numpy as np

def foo(df1,df2):

    df1['D'] = 0

    for index,row in df1.iterrows():
        name = row[2]  #for some reason name ends up as column 3 in this dataframe rather than column 0?  whatever, not important, but strange
        temp = df2.loc[(df2['name'] == name), 'weight']
        x = row[3] + temp.iloc[0] #
        df1.set_value(index,'D',x)
    print df1


df1 = pd.DataFrame({'name' : ['alex','bob', 'chris'], 'weight' : [140,150,160], 'A' : ['1','2','3'], 'B' : ['4','5','6']})
df2 = pd.DataFrame({'name' : ['alex','bob', 'chris'], 'weight' : [180,190,200], 'C' : ['1','2','3'], 'D' : ['4','5','6']})
print df1
print df2

foo(df1,df2)

相关问题 更多 >