Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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语法是什么?_Python_Function_Pandas - Fatal编程技术网

在函数调用中访问特定数据的Python语法是什么?

在函数调用中访问特定数据的Python语法是什么?,python,function,pandas,Python,Function,Pandas,我通常不是python用户。我在R和Stata做大多数事情。然而,我在这两个方面都找不到好的语义相似性包/API 我在环境中有两个数据帧。一个是问题,由2列3行组成。另一个是结果,它有3列3行 我试图将问题数据框架第一列中的每个问题(单独)与第二列中的所有问题进行比较。然后我希望输出填充结果数据框。该函数采用两个字符串作为参数,到目前为止,我的代码如下所示: for i in range(1, 3): results.iloc[i-1,i] = liteClient.co

我通常不是python用户。我在R和Stata做大多数事情。然而,我在这两个方面都找不到好的语义相似性包/API

我在环境中有两个数据帧。一个是问题,由2列3行组成。另一个是结果,它有3列3行

我试图将问题数据框架第一列中的每个问题(单独)与第二列中的所有问题进行比较。然后我希望输出填充结果数据框。该函数采用两个字符串作为参数,到目前为止,我的代码如下所示:

    for i in range(1, 3):
        results.iloc[i-1,i] = liteClient.compare(questions.iloc[0,i], questions.iloc[:,1])
我假设我没有正确地指向数据,但是我真的没有找到关于这个看似简单的问题的好文档

相比之下,这是我正在工作的R代码,它使用了一个稍微不同的函数和一个数据帧

    for (i in 1:3){
        df[,i+2] <- levenshteinSim(df$yr1questions[i], df$yr2questions)
    }
for(1:3中的i){
df[,i+2]让我们试着将每个问题A与每个问题B进行比较(相乘)

这使得:

   question_A  question_B
0           0           1
1           2           3
2           4           5
然后,让我们定义一个比较函数:

def compare(row):
    return pd.Series(row[0]*questions['question_B'])

results = questions.apply(compare, axis=1)
这给了我们:

   0   1   2
0  0   0   0
1  2   6  10
2  4  12  20
正如您在评论中所指出的,这里是一个一次只比较两个字符串的版本:

def compare(row):
    question_a = row[0]
    return pd.Series([liteClient.compare(question_a, question_b) for question_b in questions['question_B']])

根据到目前为止您所说的,这里有一些您所写的问题,从您的R编程背景可以理解:

for i in range(1, 3):
在Python3.x中,它所做的是创建一个特殊类型的函数(),您可以将其视为一种特殊类型的函数(),它允许您生成具有特定步长的数字序列(默认值为1)独占地。此外,您需要知道大多数编程语言的索引从零开始,而不是从1开始,这包括python

这个范围对象在这里做的是生成序列
1,2
,就是这样

您使用i索引的数组不会索引所有索引。我相信您需要的是:

 for i in range(3):
for i in range(3):
    results.iloc[i,:] = liteClient.compare(questions.iloc[i,0], questions.iloc[:,1])
请注意,这里只有一个数字,默认为范围的最大值,0为最小值,因此这将生成
0,1,2
序列。如果数组大小为3,则表示该数组的所有可能索引

下一行对我来说有点困惑,因为我不熟悉R,但我有点理解你试图做什么。如果我理解正确,你试图比较两列,每列3个问题,并将第1列中的每个问题与第2列中的问题进行比较,得到一个3 x 3的比较结果矩阵,你正在尝试假设大小已经正确(结果中的大小是3x3),我想解释一下我在这段代码中看到的一些特性

    results.iloc[i-1,i] = liteClient.compare(questions.iloc[0,i], questions.iloc[:,1])
在results.iloc[i-1,i]中,您将按行和列建立索引,因为i-1是行,i是列。因此,在不更改
范围(1,3)
的情况下,这将导致访问以下索引,即0,1,1,2。我相信liteClient.compare(…)应该返回1x3的数据帧,或者基于您在其中尝试执行的操作返回大小为3的列表,但情况可能并非如此,我不确定您正在使用哪个对象调用该成员函数,因此我不知道该函数的文档存在于何处。假设它返回大小为3或t的
列表
数据帧,您需要通过以下方式更改分配数据的方式:

results.iloc[i,:]  = ...
这里发生的情况是,
iloc(…)
接受一个行位置参数和一个切片位置参数,这里您将把结果矩阵中该行的所有列分配给compare返回的值。随着
for
语句的更改,这将迭代数据帧中的所有索引

 liteClient.compare(questions.iloc[0,i], questions.iloc[:,1])
当前这一行,您将迭代第一行questions.iloc中的每一列,然后将它们与第二列和第二行questions.iloc中的所有行进行比较

我相信您希望做的是将此更改为:

liteClient.compare(questions.iloc[i,0], questions.iloc[:,1])
这是针对第0列中的每个i、0、1、2,将其与第1列中的每一行进行比较。如果您的问题数据框实际组织为2列和3行,则应该可以使用,否则您还需要更改创建问题的方式

总之,我认为固定程序应该类似于:

 for i in range(3):
for i in range(3):
    results.iloc[i,:] = liteClient.compare(questions.iloc[i,0], questions.iloc[:,1])

你用的是什么python版本?@snb我正在通过Jupyter笔记本使用Anaconda 3.5.0。好的,我也许能帮你,让我写一个真实的答案quick@snb感谢您的研究!感谢您的详细解释。我想我开始看到另一个问题了。该函数来自cortexal.io“retinasdk”。我认为一个问题是一次只需要两个字符串。因此,我真正需要做的是将第一个问题列中的第一个观察值与第二个问题列中的第一个观察值进行比较。之后,我必须再次将col1row1与col2row2进行比较,然后将col2row3进行比较。然后,我将移动以比较col1row2与col2row1,然后是col1row12row2,然后是col2row3。我认为我的代码实际上没有做到这一点。每个循环应该只有一个输出。这很有效!有没有一种快速的方法可以让结果按列而不是按行填充?这样col1row1比较的输出将在结果数据框的col1中?那么col1row2结果将在结果数据框的col2中。这是太棒了…我有很多东西要学习python。我只是把它和熊猫一起转置了。没什么大不了的!非常感谢你的帮助。太棒了:)事实上,要按列获得结果,你可以转置:
results=questions.apply(compare,axis=1).T
。如果它对你的问题有效,你能把这个答案标记为接受吗?