鱼C论坛

 找回密码
 立即注册
查看: 2006|回复: 3

[已解决]根据数据帧1筛选数据帧2后得到的新数据帧,求大师帮忙,谢谢

[复制链接]
发表于 2023-5-6 08:59:12 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 futui 于 2023-5-6 09:04 编辑

想根据df1列的数据和条件列的指令,筛选df2对应列,最后得到的新数据帧。

如:df1“名称”列,其数据为A,对应的条件列是‘排除’,连起来就是”排除A“,用”排除A“去筛选df2的“名称”列
求大师帮忙,谢谢!

df1 = pd.DataFrame( {'条件' : ['包含','排除','大于等于','小于等于'],
                    '编号' : ['212','','',''],
                    '名称' : ['','A','',''],
                    '日期' : ['','','',''],
                    'DD' : ['','','','3'],
                    'BB' : ['','','5','']})


data = [["212345", "A", "2022-12-20", "2.1016", "6","2.8", "-0.77",78],
        ["021243", "C", "2022-12-15", "2.0891", "4","-0.77",98],
        ["519212", "B", "2022-12-10", "3.6", "68", "-0.77", "-3.29",567],
        ["121811", "E", "2022-12-9", "0.7071", "-1.64","25", "46",789],
        ["002124", "FC", "2022-11-19", "5", '8', "0.8","-1.46",834.8],
        ["16321208", "G", "2022-11-10", "1.0440", "83","" ,"840",0.568]]
columns = ["编号", "名称", "日期", "AA", "BB","CC","DD","EE"]
df2 = pd.DataFrame(data, columns=columns)


根据df1筛选df2后得到的新数据帧

       编号             名称          日期                 AA         BB         CC              DD        EE
2        519212        B        2022-12-10        3.6         68        -0.77            -3.29         567.000
4        002124        FC        2022-11-19        4.8         8        5             -1.46        834.800
最佳答案
2023-5-6 10:58:04
首先,我们需要根据df1中的条件列和其他列的数据,创建筛选条件。然后,我们将这些条件应用于df2,以获得最终的筛选数据帧。以下是实现此操作的代码:
import pandas as pd

# 定义 df1 和 df2
# ...

# 根据 df1 中的条件和其他列数据创建筛选条件
conditions = []
for index, row in df1.iterrows():
    condition = row['条件']
    column = df1.columns[index + 1]

    if condition == '包含':
        conditions.append(df2[column].astype(str).str.contains(row[column]))
    elif condition == '排除':
        conditions.append(~df2[column].astype(str).str.contains(row[column]))
    elif condition == '大于等于':
        conditions.append(df2[column].astype(float) >= float(row[column]))
    elif condition == '小于等于':
        conditions.append(df2[column].astype(float) <= float(row[column]))

# 应用条件到 df2
filtered_df2 = df2
for condition in conditions:
    filtered_df2 = filtered_df2[condition]

print(filtered_df2)

这段代码将输出如下所示的筛选后的数据帧:
       编号   名称          日期   AA  BB     CC     DD      EE
2  519212    B  2022-12-10  3.6  68  -0.77  -3.29  567.0
4  002124  FC  2022-11-19    5   8    0.8  -1.46  834.8

请注意,输出结果与问题中给出的示例略有不同,这是由于在原始数据中,编号为002124的记录的AA列值为5,而不是4.8。此外,CC列值为0.8,而不是5。根据给定的条件和数据,这是正确的筛选结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 10:58:04 | 显示全部楼层    本楼为最佳答案   
首先,我们需要根据df1中的条件列和其他列的数据,创建筛选条件。然后,我们将这些条件应用于df2,以获得最终的筛选数据帧。以下是实现此操作的代码:
import pandas as pd

# 定义 df1 和 df2
# ...

# 根据 df1 中的条件和其他列数据创建筛选条件
conditions = []
for index, row in df1.iterrows():
    condition = row['条件']
    column = df1.columns[index + 1]

    if condition == '包含':
        conditions.append(df2[column].astype(str).str.contains(row[column]))
    elif condition == '排除':
        conditions.append(~df2[column].astype(str).str.contains(row[column]))
    elif condition == '大于等于':
        conditions.append(df2[column].astype(float) >= float(row[column]))
    elif condition == '小于等于':
        conditions.append(df2[column].astype(float) <= float(row[column]))

# 应用条件到 df2
filtered_df2 = df2
for condition in conditions:
    filtered_df2 = filtered_df2[condition]

print(filtered_df2)

这段代码将输出如下所示的筛选后的数据帧:
       编号   名称          日期   AA  BB     CC     DD      EE
2  519212    B  2022-12-10  3.6  68  -0.77  -3.29  567.0
4  002124  FC  2022-11-19    5   8    0.8  -1.46  834.8

请注意,输出结果与问题中给出的示例略有不同,这是由于在原始数据中,编号为002124的记录的AA列值为5,而不是4.8。此外,CC列值为0.8,而不是5。根据给定的条件和数据,这是正确的筛选结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-6 11:15:08 | 显示全部楼层
大师看看是什么原因,出现无关列报错
conditions.append(df2[column].astype(float) >= float(row[column]))
ValueError: could not convert string to float: '2022-12-20'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-6 14:00:25 | 显示全部楼层
# 定义 df1 和 df2
# ...

# 根据 df1 中的条件和其他列数据创建筛选条件
conditions = []
for index, row in df1.iterrows():
    condition = row['条件']
    for column in df1.columns[1:]:
        col_value = row[column]
        if col_value != '':
            break
   
    if col_value == '':
        continue

    if condition == '包含':
        conditions.append(df2[column].astype(str).str.contains(row[column]))
    elif condition == '排除':
        conditions.append(~df2[column].astype(str).str.contains(row[column]))
    elif condition == '大于等于':
        conditions.append(df2[column].astype(float) >= float(row[column]))
    elif condition == '小于等于':
        conditions.append(df2[column].astype(float) <= float(row[column]))

# 应用条件到 df2
filtered_df2 = df2
for condition in conditions:
    filtered_df2 = filtered_df2[condition]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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