如何解决传递列表时如何遍历 *args?
我编写了以下函数,它将数据帧的任意数量的列作为列表,然后打印指定列的中位数:
def calculate_median(dataframe,*args,*kwargs):
print("Median of columns: ")
for colname in args or kwargs.values():
median_of_column = np.median(dataframe[colname])
print(f"{median_of_column}",sep="\n")
return colname
因此,如果我在数据框中有以下列列表:
colnames = ['Col A','Col B','Col C','Col D']
我遇到的问题是解释器将整个列表作为一个整体参数,并显示仅第一列(Col A)的中位数。
我不确定我做错了什么。你能帮忙吗?
解决方法
如果你像这样调用你的函数:
df = ...
colname = calculate_median(df,colnames)
你需要这样称呼它:
df = ...
colname = calculate_median(df,*colnames)
*args
参数表示“任意数量的非关键字(即未命名)参数”。如果您只传递一个列表 (colnames
),则它是单个参数,而不是多个参数。传递 *colnames
的意思是“解压此列表并将其中的项目用作参数”。
首先,您在 *kwargs
上缺少一个星号。您的函数签名应该是:
def calculate_mean(dataframe,*args,**kwargs):
其次,我不确定您的 for 循环是否按照您的想法执行。目前它会迭代 args
并且只在 args 为 kwargs.values()
或为空的情况下迭代 None
。如果您想始终迭代两者,您可以将 kwargs.values()
转换为元组,使其具有与 args
相同的类型,然后将它们连接起来:
for colname in args + tuple(kwargs.values()):
然后你会像这样调用你的函数:
calculate_mean('Col A','Col B','Col C','Col D')
或者如果你有一个列表:
colnames = ['Col A','Col D']
并且您想以列表的每个成员作为参数调用该函数,则需要在调用该函数时使用星号对列表进行解包:
calculate_mean(*colnames)
,
您需要将 *df.columns
作为 *args
参数传递以获得所需的结果。因为只传递 df.columns
不会解压列的值。
我不明白你为什么需要 *kwargs
参数。
import numpy as np
import pandas as pd
df = pd.DataFrame({"a": [1,2,3,4,5],"b": [11,22,33,44,55],"c": [111,222,333,444,555]})
print(df)
# error: need double *
def calculate_median(dataframe,**kwargs):
print("Median of columns: ")
for colname in args or kwargs.values():
median_of_column = np.median(dataframe[colname])
print(f"{median_of_column}",sep="\n")
return colname
# get dataframe column names
colnames= df.columns.values
print(f"colnames type={type(colnames)}")
print(f"colnames values={colnames}")
# call function
calculate_median(df,*colnames)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。