如何使用数据帧函数带动态参数的问题,请大师帮忙,谢谢!!
陶远航大师帮我具体问题,给予 了完整答案(附最后),但有一个问题就是如何动态使用这个函数?刚举例是色金属/5.88 也有其它许多可能,如电子元件/5.3,或医疗服务/9.7,我就不知道如何灵活运用?请大师
帮忙,或给予新的解决途径,谢谢!!
import pandas as pd
data = [['AA','光伏设备/2.51?医疗服务/3.75?色金属6.39'],
['BW','色金属/4.39?电子/5.31?电设/18.2'],
['BW','电子/5.31?金属/5.31?电设/18.2'],
['BG','色金属/8.39?电子元件/5.31?设备/8.82']]
columns = ["编号",'清单']
df = pd.DataFrame(data, columns=columns)
print(df)
上述数据帧的《清单》列,可以根据某条件:如,色金属/5.88过滤掉不符合要求的行
就是两个条件,一是色金属,二是反斜杠后面的数字要大于5.88
有什么好办法吗?求大师的帮忙,谢谢
结果;
编号 清单
0AA光伏设备/2.51?医疗服务/3.75?色金属6.39
3BG 色金属/8.39?电子元件/5.31?设备/8.82
# 导入 pandas 模块
import pandas as pd
# 创建数据帧
data = [['AA','光伏设备/2.51 ?医疗服务/3.75 ?色金属6.39'],
['BW','色金属/4.39 ?电子/5.31 ?电设/18.2'],
['BW','电子/5.31 ?金属/5.31 ?电设/18.2'],
['BG','色金属/8.39 ?电子元件/5.31 ?设备/8.82']]
columns = ["编号",'清单']
df = pd.DataFrame(data, columns=columns)
# 定义一个函数,用来判断清单中是否包含“色金属”和大于 5.88 的数字
def filter_func(x):
# 如果清单中包含“色金属”,则分割字符串并获取数字
if "色金属" in x:
num = float(x.split("色金属").split("?").strip("/"))
# 如果数字大于 5.88,返回 True,否则返回 False
return num > 5.88
# 如果清单中不包含“色金属”,返回 False
else:
return False
# 使用 apply 方法和 lambda 表达式,对数据帧的清单列应用过滤函数
df_filtered = df.apply(lambda x: filter_func(x))]
# 打印过滤后的数据帧
print(df_filtered) 根据您提供的需求,可以使用 pandas 库的 apply 方法结合 lambda 表达式来实现。具体做法是先定义一个函数 filter_func,在函数中判断清单字符串中是否包含“色金属”,若包含则获取数字并判断是否大于 5.88,最后返回 True 或 False。之后使用 apply 方法和 lambda 表达式将 filter_func 函数应用于数据帧的清单列,过滤出符合条件的行。具体代码如下:
python
import pandas as pd
data = [['AA','光伏设备/2.51 ?医疗服务/3.75 ?色金属6.39'],
['BW','色金属/4.39 ?电子/5.31 ?电设/18.2'],
['BW','电子/5.31 ?金属/5.31 ?电设/18.2'],
['BG','色金属/8.39 ?电子元件/5.31 ?设备/8.82']]
columns = ["编号",'清单']
df = pd.DataFrame(data, columns=columns)
def filter_func(x):
if "色金属" in x:
num = float(x.split("色金属").split("?").strip("/"))
return num > 5.88
else:
return False
df_filtered = df.apply(lambda x: filter_func(x))]
print(df_filtered)
以上代码会输出过滤后的结果。
本帖最后由 陶远航 于 2023-5-7 13:39 编辑
您可以将过滤条件的值写入函数参数,使函数更加灵活。例如,可以将要过滤的金属名称和最小数字值作为函数参数传递,如下所示:
def filter_func(x, metal, num):
# 如果清单中包含指定的金属名称,分割字符串并获取数字
if metal in x:
num_value = float(x.split(metal).split("?").strip("/"))
# 如果数字大于指定的 num 值,返回 True,否则返回 False
return num_value > num
# 如果清单中不包含指定的金属名称,返回 False
else:
return False
然后,您可以使用 Pandas 的 apply() 方法和 lambda 表达式来应用过滤函数,并将过滤条件的值作为参数传递给函数,如下所示:
# 过滤条件
metal = "色金属"
num = 5.88
# 应用过滤函数并传递过滤条件的值
df_filtered = df.apply(lambda x: filter_func(x, metal, num))]
这样,您就可以根据不同的过滤条件使用同一个函数来动态过滤数据帧。 你可以将过滤条件写成参数,以便在调用函数时灵活地传入。例如,可以将“色金属”和数字 5.88 写成函数的两个参数:
def filter_func(x, keyword, num):
# 如果清单中包含关键词,分割字符串并获取数字
if keyword in x:
num_ = float(x.split(keyword).split("?").strip("/"))
# 如果数字大于指定数字,返回 True,否则返回 False
return num_ > num
# 如果清单中不包含关键词,返回 False
else:
return False
接着,在调用函数时传入关键词和数字参数即可。例如,要过滤出 “色金属” 中大于 5.88 的行,可以这样使用:
df_filtered = df.apply(lambda x: filter_func(x, "色金属", 5.88))]
如果要过滤其他关键词和数字,只需要相应地修改这两个参数即可。
有用请设置最佳答案 陶远航 发表于 2023-5-7 13:35
我可以帮你修改一下过滤函数,让它更灵活一些。你可以把你想要过滤的子字符串和阈值作为函数的参数,然后在 ...
怎样写呢? sfqxx 发表于 2023-5-7 13:36
你可以将过滤条件写成参数,以便在调用函数时灵活地传入。例如,可以将“色金属”和数字 5.88 写成函数的两 ...
wc,和我一模一样,果然是一个gpt啊 首先,我们为你解答如何使用数据帧函数将参数动态化。
在上面给出的代码中,我们定义了一个函数filter_func(x)用于过滤数据。当前的条件是只筛选清单中包含“色金属”且反斜杠后的数字大于5.88的行。为了让这个函数支持动态参数,我们可以传递一个额外的参数给filter_func(x) ,如下所示:
def filter_func(x, keyword, threshold):
if keyword in x:
num = float(x.split(keyword).split("?").strip("/"))
return num > threshold
else:
return False
df_filtered = df.apply(lambda x: filter_func(x, "色金属", 5.88))]
现在filter_func(x)函数接受两个额外的参数,即keyword和threshold 。在调用过滤函数的时候,根据实际需求传递这两个参数即可。例如:
df_filtered = df.apply(lambda x: filter_func(x, "电子元件", 5.3))]
或者
df_filtered = df.apply(lambda x: filter_func(x, "医疗服务", 9.7))]
这样你就可以根据不同的需求灵活运用过滤函数来筛选数据了。 isdkz 发表于 2023-5-7 13:38
首先,我们为你解答如何使用数据帧函数将参数动态化。
在上面给出的代码中,我们定义了一个函数filter ...
az,我们的chat generative pre-trained transformer回答都一毛一样{:10_282:} 谢谢给我最佳! {:10_244:}
为什么明明是我第一个,最佳不是我的 你不是回复我问的问题
页:
[1]