Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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_Pandas - Fatal编程技术网

在python中如何将多个变量传递给函数?

在python中如何将多个变量传递给函数?,python,pandas,Python,Pandas,我想比较几对数据帧中的一列,并将共享值写入一个空列表。我已经编写了一个函数,可以用一对数据帧来实现这一点,但我似乎无法将其放大 def parser(dataframe1,dataframe2,emptylist): for i1 in dataframe1['POS']: for i2 in dataframe2['POS']: if i1 == i2: emptylist.a

我想比较几对数据帧中的一列,并将共享值写入一个空列表。我已经编写了一个函数,可以用一对数据帧来实现这一点,但我似乎无法将其放大

   def parser(dataframe1,dataframe2,emptylist):
        for i1 in dataframe1['POS']:
            for i2 in dataframe2['POS']:
                if i1 == i2:
                    emptylist.append(i1)
其中“POS”是两个数据帧中的列标题

我已经为这个函数的每个输入值列出了一个变量名列表,例如

dataframe1_names=['name1','name2',etc...]
dataframe2_names=['name1','name2',etc...]
emptylist_names=['name1','name2',etc...]
其中,列表的每个元素都是一个字符串,其中包含变量的名称,前两个为数据帧,最后一个为空列表

我尝试使用以下代码遍历这些列表:

import itertools

for a, b, c in zip(range(len(dataframe1_names)), range(len(dataframe2_names)), range(len(emptylist_names))):
    parser(dataframe1_names[a],dataframe2_names[b],emptylist_names[c])
但这将返回TypeError:字符串索引必须是整数

我认为,这个错误是因为向函数传递了一个包含变量名的字符串,而不是变量名本身。有没有其他方法可以自动将多个变量传递给函数

谢谢你的帮助

是否必须使用对象名称字符串,而不仅仅是对象本身?如果你这样做

dataframes1=[name1,name2,...]
dataframes2=[name1,name2,...]
emptylists=[name1,name2,...]
那你就做吧

for a,b,c in zip( dataframes1, dataframes2, emptylists ):
    parser(a,b,c)
顺便说一句,你这样做真的是迂回和不和谐的,所以我改变了一点。我没有为for语句获取索引列表,而是遍历列表,从而遍历对象本身。这是更紧凑,更容易理解。就这点而言,您是否需要输入空列表作为参数,例如,它们可能并不总是空的?您的解析器代码虽然正确,但根本没有利用pandas,而且速度非常慢:要比较列,只需执行dataframe1['COL']==dataframe2['COL'],这将为您提供一个布尔值序列,其中的值相等。然后,您可以使用它对数据帧进行索引,以获取共享值。它以数据帧或序列的形式出现,但很容易转换为列表。因此,如果您不需要首先在其他地方创建空列表,那么您的解析器函数可以简化为以下内容:

def parser( df1, df2 ):
    return list( df1['COL'][ df1['COL']==df2['COL'] ] )
这将要快得多,但当它返回列表时,您必须对其进行处理,因此在您的情况下,您可以执行以下操作:

sharedlists = [ parser(a,b) for a,b in zip( dataframes1, dataframes2 ) ]
如果必须使用变量名,则以下非常不安全的代码会将名称列表转换为对象列表,您需要为每个列表执行此操作:

dataframes1 = [ eval(name) for name in dataframe1_names ]

如果这只是为了在解释器中进行数值计算,那么eval是可以的,但是对于您正在发布的任何代码,它都是非常不安全的:它将计算传递给它的字符串中的任何代码,从而允许任意代码执行。

这听起来像是一个脚本的用例

查询的一个用例是当您有一个DataFrame集合时 在中具有列名或索引级别/名称子集的对象 常见的您可以将相同的查询传递给两个帧,而无需 指定要查询的帧


如果您有两个以上的数据帧对象,您需要什么样的输出?在仅有两行的情况下,以下行将完成解析器函数的功能:

common = df1[df1["fieldname"] == df2["fieldname"]]["fieldname"]
除此之外,common是一个数据帧对象本身,而不是一个列表,但是通过执行listcommon,您可以很容易地从中获得一个列表

如果您正在寻找一个函数,该函数接受任意数量的数据帧,并在某个字段中为每对数据帧返回一个公共值列表,则可以执行以下操作:

from itertools import combinations
def common_lists(field, *dfs):
    return [df1[df1[field] == df2[field]][field] for df1, df2 in combinations(dfs, 2)]
[(0,0,0), (1,1,1), ... (n,n,n)]
从数据帧中获取列表的方法同样适用于这里,因为您将获得一个数据帧列表

就这一点而言:

import itertools

for a, b, c in zip(range(len(dataframe1_names)), range(len(dataframe2_names)), range(len(emptylist_names))):
    parser(dataframe1_names[a],dataframe2_names[b],emptylist_names[c])
您要做的是创建一个如下所示的列表:

from itertools import combinations
def common_lists(field, *dfs):
    return [df1[df1[field] == df2[field]][field] for df1, df2 in combinations(dfs, 2)]
[(0,0,0), (1,1,1), ... (n,n,n)]
其中,n是dataframe1_名称、dataframe2_名称和emptylist_名称中最短者的长度。因此,在循环的第一次迭代中,a==b==c==0,使用这些值索引到数据帧变量名数组中,因此调用parsername1、name1、name1,传递字符串而不是数据帧对象。您的解析器函数需要DataFrame对象,因此当您尝试调用dataframe1[POS]时,它会发出barfs,其中dataframe1是字符串名称1