futui 发表于 2023-5-7 13:32:21

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

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

歌者文明清理员 发表于 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("色金属").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:35:58

本帖最后由 陶远航 于 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))]

这样,您就可以根据不同的过滤条件使用同一个函数来动态过滤数据帧。

sfqxx 发表于 2023-5-7 13:36:10

你可以将过滤条件写成参数,以便在调用函数时灵活地传入。例如,可以将“色金属”和数字 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:37:12

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

怎样写呢?

歌者文明清理员 发表于 2023-5-7 13:37:45

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

wc,和我一模一样,果然是一个gpt啊

isdkz 发表于 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).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))]


这样你就可以根据不同的需求灵活运用过滤函数来筛选数据了。

歌者文明清理员 发表于 2023-5-7 13:42:35

isdkz 发表于 2023-5-7 13:38
首先,我们为你解答如何使用数据帧函数将参数动态化。

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

az,我们的chat generative pre-trained transformer回答都一毛一样{:10_282:}

陶远航 发表于 2023-5-7 16:07:40

谢谢给我最佳!

歌者文明清理员 发表于 2023-5-7 19:09:47

{:10_244:}
为什么明明是我第一个,最佳不是我的

futui 发表于 2023-5-7 19:13:05

你不是回复我问的问题
页: [1]
查看完整版本: 如何使用数据帧函数带动态参数的问题,请大师帮忙,谢谢!!