我们需要比较来自多对 pandas 数据框的一列,并将共享值写入空列表。我们已经编写了一个函数,可以使用单个数据帧对来执行此操作,但似乎无法将其扩展。
以下是我们编写的函数:
def parser(dataframe1, dataframe2, emptylist):
for i1 in dataframe1['POS']:
for i2 in dataframe2['POS']:
if i1 == i2:
emptylist.append(i1)
其中,“POS”是两个 pandas 数据框中的列标题。
我们已经为函数的每个输入值编制了一个变量名称列表,例如:
dataframe1_names = ['name1', 'name2', etc...]
dataframe2_names = ['name1', 'name2', etc...]
emptylist_names = ['name1', 'name2', etc...]
其中,列表的每个元素都是一个包含变量名称的字符串(对于前两个,是 pandas 数据框,对于最后一个,是空列表)。
我们尝试使用以下代码迭代这些列表:
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:字符串索引必须是整数。
我们认为此错误来自向函数传递包含变量名称的字符串,而不是变量名称本身。是否有另一种方法可以自动向函数传递多个变量?
2、解决方案
为了将多个变量传递给 Python 函数,可以使用以下方法:
- 使用 可变长参数列表(*args),它允许函数接收任意数量的位置参数。
- 使用 关键字参数(****kwargs),它允许函数接收任意数量的关键字参数。
我们也可以使用 zip() 函数将多个列表中的元素组合成元组,然后将这些元组作为参数传递给函数。
使用可变长参数列表
我们可以将函数 parser()
修改为使用可变长参数列表,如下所示:
def parser(*args):
dataframe1, dataframe2, emptylist = args
for i1 in dataframe1['POS']:
for i2 in dataframe2['POS']:
if i1 == i2:
emptylist.append(i1)
现在,我们可以使用以下代码调用函数 parser()
,并将多个变量作为参数传递给它:
parser(dataframe1, dataframe2, emptylist)
使用关键字参数
我们也可以将函数 parser()
修改为使用关键字参数,如下所示:
def parser(**kwargs):
dataframe1 = kwargs['dataframe1']
dataframe2 = kwargs['dataframe2']
emptylist = kwargs['emptylist']
for i1 in dataframe1['POS']:
for i2 in dataframe2['POS']:
if i1 == i2:
emptylist.append(i1)
现在,我们可以使用以下代码调用函数 parser()
,并将多个变量作为关键字参数传递给它:
parser(dataframe1=dataframe1, dataframe2=dataframe2, emptylist=emptylist)
使用 zip() 函数
我们也可以使用 zip()
函数将多个列表中的元素组合成元组,然后将这些元组作为参数传递给函数 parser()
,如下所示:
for args in zip(dataframe1_names, dataframe2_names, emptylist_names):
parser(*args)
这样,我们就通过多种方法将多个变量传递给 Python 函数。