鱼C论坛

 找回密码
 立即注册
查看: 2191|回复: 10

[已解决]如何使用数据帧函数带动态参数的问题,请大师帮忙,谢谢!!

[复制链接]
发表于 2023-5-7 13:32:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
陶远航大师帮我具体问题,给予 了完整答案(附最后),但有一个问题就是如何动态使用这个函数?
刚举例是  色金属/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

有什么好办法吗?求大师的帮忙,谢谢

结果;
   编号                               清单
0  AA  光伏设备/2.51  ?医疗服务/3.75  ?色金属6.39
3  BG   色金属/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("色金属")[1].split("?")[0].strip("/"))
        # 如果数字大于 5.88,返回 True,否则返回 False
        return num > 5.88
    # 如果清单中不包含“色金属”,返回 False
    else:
        return False

# 使用 apply 方法和 lambda 表达式,对数据帧的清单列应用过滤函数
df_filtered = df[df["清单"].apply(lambda x: filter_func(x))]

# 打印过滤后的数据帧
print(df_filtered)
最佳答案
2023-5-7 13:35:58
本帖最后由 陶远航 于 2023-5-7 13:39 编辑

您可以将过滤条件的值写入函数参数,使函数更加灵活。例如,可以将要过滤的金属名称和最小数字值作为函数参数传递,如下所示:
def filter_func(x, metal, num):
    # 如果清单中包含指定的金属名称,分割字符串并获取数字
    if metal in x:
        num_value = float(x.split(metal)[1].split("?")[0].strip("/"))
        # 如果数字大于指定的 num 值,返回 True,否则返回 False
        return num_value > num
    # 如果清单中不包含指定的金属名称,返回 False
    else:
        return False
然后,您可以使用 Pandas 的 apply() 方法和 lambda 表达式来应用过滤函数,并将过滤条件的值作为参数传递给函数,如下所示:
# 过滤条件
metal = "色金属"
num = 5.88

# 应用过滤函数并传递过滤条件的值
df_filtered = df[df["清单"].apply(lambda x: filter_func(x, metal, num))]
这样,您就可以根据不同的过滤条件使用同一个函数来动态过滤数据帧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-7 13:35:04 | 显示全部楼层
根据您提供的需求,可以使用 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("色金属")[1].split("?")[0].strip("/"))
        return num > 5.88
    else:
        return False

df_filtered = df[df["清单"].apply(lambda x: filter_func(x))]
print(df_filtered)
以上代码会输出过滤后的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:35:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 陶远航 于 2023-5-7 13:39 编辑

您可以将过滤条件的值写入函数参数,使函数更加灵活。例如,可以将要过滤的金属名称和最小数字值作为函数参数传递,如下所示:
def filter_func(x, metal, num):
    # 如果清单中包含指定的金属名称,分割字符串并获取数字
    if metal in x:
        num_value = float(x.split(metal)[1].split("?")[0].strip("/"))
        # 如果数字大于指定的 num 值,返回 True,否则返回 False
        return num_value > num
    # 如果清单中不包含指定的金属名称,返回 False
    else:
        return False
然后,您可以使用 Pandas 的 apply() 方法和 lambda 表达式来应用过滤函数,并将过滤条件的值作为参数传递给函数,如下所示:
# 过滤条件
metal = "色金属"
num = 5.88

# 应用过滤函数并传递过滤条件的值
df_filtered = df[df["清单"].apply(lambda x: filter_func(x, metal, num))]
这样,您就可以根据不同的过滤条件使用同一个函数来动态过滤数据帧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:36:10 | 显示全部楼层
你可以将过滤条件写成参数,以便在调用函数时灵活地传入。例如,可以将“色金属”和数字 5.88 写成函数的两个参数:

def filter_func(x, keyword, num):
    # 如果清单中包含关键词,分割字符串并获取数字
    if keyword in x:
        num_ = float(x.split(keyword)[1].split("?")[0].strip("/"))
        # 如果数字大于指定数字,返回 True,否则返回 False
        return num_ > num
    # 如果清单中不包含关键词,返回 False
    else:
        return False
接着,在调用函数时传入关键词和数字参数即可。例如,要过滤出 “色金属” 中大于 5.88 的行,可以这样使用:

df_filtered = df[df["清单"].apply(lambda x: filter_func(x, "色金属", 5.88))]
如果要过滤其他关键词和数字,只需要相应地修改这两个参数即可。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:37:12 | 显示全部楼层
陶远航 发表于 2023-5-7 13:35
我可以帮你修改一下过滤函数,让它更灵活一些。你可以把你想要过滤的子字符串和阈值作为函数的参数,然后在 ...

怎样写呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:37:45 | 显示全部楼层
sfqxx 发表于 2023-5-7 13:36
你可以将过滤条件写成参数,以便在调用函数时灵活地传入。例如,可以将“色金属”和数字 5.88 写成函数的两 ...

wc,和我一模一样,果然是一个gpt啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:38:06 | 显示全部楼层
首先,我们为你解答如何使用数据帧函数将参数动态化。

在上面给出的代码中,我们定义了一个函数  filter_func(x)  用于过滤数据。当前的条件是只筛选清单中包含“色金属”且反斜杠后的数字大于5.88的行。为了让这个函数支持动态参数,我们可以传递一个额外的参数给  filter_func(x) ,如下所示:
def filter_func(x, keyword, threshold):
    if keyword in x:
        num = float(x.split(keyword)[1].split("?")[0].strip("/"))
        return num > threshold
    else:
        return False

df_filtered = df[df["清单"].apply(lambda x: filter_func(x, "色金属", 5.88))]

现在  filter_func(x)  函数接受两个额外的参数,即  keyword  和  threshold 。在调用过滤函数的时候,根据实际需求传递这两个参数即可。例如:
df_filtered = df[df["清单"].apply(lambda x: filter_func(x, "电子元件", 5.3))]

或者
df_filtered = df[df["清单"].apply(lambda x: filter_func(x, "医疗服务", 9.7))]

这样你就可以根据不同的需求灵活运用过滤函数来筛选数据了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 13:42:35 | 显示全部楼层
isdkz 发表于 2023-5-7 13:38
首先,我们为你解答如何使用数据帧函数将参数动态化。

在上面给出的代码中,我们定义了一个函数  filter ...

az,我们的chat generative pre-trained transformer回答都一毛一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 16:07:40 | 显示全部楼层
谢谢给我最佳!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:09:47 | 显示全部楼层

为什么明明是我第一个,最佳不是我的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-7 19:13:05 | 显示全部楼层
你不是回复我问的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 03:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表