我有一个包含以下列的DataFrame:INVOICE_DATE、COUNTRY、CUSTOMER_ID、INVOICE_ID、DESCRIPTION、USIM和DEMANDQTY.我想根据特定条件过滤DataFrame.

enter image description here

条件是,如果Description列包含单词"Kids"或"Baby",我希望在过滤后的DataFrame中包含该INVOICE_ID中的所有值.换句话说,要包括整个交易,交易中至少应该有一个项目属于 children 或婴儿类别.

我曾try 将str.containes()方法与正则表达式模式结合使用,但在获得所需结果时遇到了问题.

以下是我的代码:

import pandas as pd

# Assuming the DataFrame is named 'df'

# Filter the DataFrame based on the condition
filtered_df = df[df['DESCRIPTION'].str.contains('kids|baby', case=False, regex=True)]

# Print the filtered DataFrame
filtered_df

但是,此代码没有提供预期的结果.它基于单个行筛选数据框,而不是考虑整个事务.

请在下面找到测试数据:

import pandas as pd
import random
import string
import numpy as np

random.seed(42)
np.random.seed(42)

num_transactions = 100
max_items_per_transaction = 6

# Generate a list of possible items
possible_items = [
    "Kids T-shirt", "Baby Onesie", "Kids Socks",
    "Men's Shirt", "Women's Dress", "Kids Pants",
    "Baby Hat", "Women's Shoes", "Men's Pants",
    "Kids Jacket", "Baby Bib", "Men's Hat",
    "Women's Skirt", "Kids Shoes", "Baby Romper",
    "Men's Sweater", "Kids Gloves", "Baby Blanket"
]

# Create the DataFrame
rows = []

for i in range(num_transactions):
    num_items = random.randint(1, max_items_per_transaction)
    items = random.sample(possible_items, num_items)
    invoice_dates = pd.date_range(start='2022-01-01', periods=num_items, freq='D')
    countries = random.choices(['USA', 'Canada', 'UK'], k=num_items)
    customer_id = i + 1
    invoice_id = 1001 + i

    for j in range(num_items):
        item = items[j]
        usim = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))  # Generate a random 6-character USIM value
        demand_qty = random.randint(1, 10)

        row = {
            'INVOICE_DATE': invoice_dates[j],
            'COUNTRY': countries[j],
            'CUSTOMER_ID': customer_id,
            'INVOICE_ID': invoice_id,
            'DESCRIPTION': item,
            'USIM': usim,
            'DEMANDQTY': demand_qty
        }
        rows.append(row)

df = pd.DataFrame(rows)

# Print the DataFrame
df

有人能指导我如何根据描述的条件正确过滤DataFrame吗?如有任何帮助或建议,我将不胜感激.谢谢!

推荐答案

假设以下数据帧:

>>> df
  DESCRIPTION  INVOICE_ID
0        kids         123
1       hello         123
2       world         123
3     another         456
4         one         456

您可能希望保留INVOICE_ID=123,因为在第0行的描述中有‘KILDS’:

m = df['DESCRIPTION'].str.contains('kids|baby', case=False, regex=True)
filtered_df = df[m.groupby(df['INVOICE_ID']).transform('max')]

输出:

>>> filtered_df
  DESCRIPTION  INVOICE_ID
0        kids         123
1       hello         123
2       world         123

Python相关问答推荐

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

Pystata:从Python并行运行stata实例

发生异常:TclMessage命令名称无效.!listbox"

Python键入协议默认值

从groupby执行计算后创建新的子框架

如何请求使用Python将文件下载到带有登录名的门户网站?

Python中绕y轴曲线的旋转

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如何创建一个缓冲区周围的一行与manim?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

移动条情节旁边的半小提琴情节在海运

从嵌套的yaml创建一个嵌套字符串,后面跟着点

将scipy. sparse矩阵直接保存为常规txt文件

如何将数据帧中的timedelta转换为datetime

仅使用预先计算的排序获取排序元素

ModuleNotFoundError:Python中没有名为google的模块''

pytest、xdist和共享生成的文件依赖项

查找数据帧的给定列中是否存在特定值