|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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: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))]
复制代码
这样,您就可以根据不同的过滤条件使用同一个函数来动态过滤数据帧。
|
|