Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从另一个数据帧的字符串注释中删除数据帧类别中的最大值_Python_Pandas - Fatal编程技术网

Python:从另一个数据帧的字符串注释中删除数据帧类别中的最大值

Python:从另一个数据帧的字符串注释中删除数据帧类别中的最大值,python,pandas,Python,Pandas,我有一个包含数千行的数据集,在“值”列中有一些异常值 df_test = pd.DataFrame({ 'product': ['Egg', 'Egg', 'Egg', 'Small Egg','Small Egg','Small Egg','Small Egg', 'Wheat','Wheat','Wheat','Wheat','Wheat','Rice','Rice','Rice','Garlic','Garlic','Garlic','Garlic','G

我有一个包含数千行的数据集,在“值”列中有一些异常值

df_test = pd.DataFrame({
                 'product': ['Egg', 'Egg', 'Egg', 'Small Egg','Small Egg','Small Egg','Small Egg', 'Wheat','Wheat','Wheat','Wheat','Wheat','Rice','Rice','Rice','Garlic','Garlic','Garlic','Garlic','Garlic','Tomato','Tomato','Tomato', 'Ananas'], 
                 'value': ['13','5','3','28','5','4','5','28','28','28','1','1.5','7','4','4.3','140','143','149','320','5','400','10','15', '8']                  
                      })
我从另一个数据集中可用的注释中知道哪些数据不正确,这一个基本上是产品列表(唯一),带有要删除的最大值注释:

df_test_comment = pd.DataFrame({
                     'product': ['Egg', 'Small Egg', 'Wheat', 'Rice', 'Garlic','Tomato', 'Ananas'], 
                     'What to remove': ['1st max','1st and 2nd max','1st, 2nd, and 3rd max', '1st max', '1st, 2nd, 3rd and 4th max','1st and 2nd max', 'NaN']                  
                    })
因为我只有有限数量的不同注释(“第一个最大值”、“第一个和第二个最大值”、“第一个、第二个和第三个最大值”、“第一个、第二个、第三个和第四个最大值”),所以我考虑使用for循环在df_test中删除产品的最大值,如果df_test_comment中的注释是“第一个最大值”;“第一最大值和第二最大值”等时的最大值和第二最大值

示例的理想输出如下所示:

df_result = pd.DataFrame({
                     'product': ['Egg','Egg','Small Egg','Small Egg','Wheat','Wheat','Rice','Rice','Garlic','Tomato', 'Ananas'], 
                     'Value': ['5','3','4','5','1','1.5','4','4.3','5','10','8']                  
                    })

知道如何处理这个清理吗?

我们需要多个步骤,首先找到数字,然后分解它,第二步从
df\u test
创建带有
cumcount
的附加秩键:注意,假设datatframe已经按值排序

#1st part
df_test['value']=pd.to_numeric(df_test['value'])
df_test=df_test.sort_values('value',ascending=False)
df_test_comment['number']=df_test_comment['What to remove'].str.findall('\d+')
df_test_comment=df_test_comment.explode('number')
#2nd part
m1=df_test['product']+(df_test.groupby('product').cumcount()+1).astype(str)
m2=df_test_comment['product']+df_test_comment['number']
dftest=df_test[~m1.isin(m2)].sort_index()


dftest
      product  value
1         Egg    5.0
2         Egg    3.0
4   Small Egg    5.0
5   Small Egg    4.0
10      Wheat    1.0
11      Wheat    1.5
13       Rice    4.0
14       Rice    4.3
19     Garlic    5.0
21     Tomato   10.0
23     Ananas    8.0

感谢Yoben的输入,如果数据帧尚未按值排序,会发生什么情况?如果我查找的不是最大值,而是最小值,则过程是否相同?@AdD我已经考虑过这一点检查前两个line@AdD对于第二个问题,df_test=df_test.sort_value('value'),移除上升=错误