【问题标题】:creating new column based on multiple conditional statements pandas dataframe基于多个条件语句熊猫数据框创建新列
【发布时间】:2021-08-27 08:44:33
【问题描述】:

我有一个包含以下详细信息的机器数据集。

样本df:

需要创建一个名为“质量匹配”的新列,该列指示当前班次计划质量是否与实际质量相同

以下是条件。

1.)首先,需要检查计划质量是否与实际质量相同,如果是的话>>>更新“质量匹配”为0。

2.) 2.1 如果不同,需要检查上一班的实际质量是否与当前实际质量相同和 2.2 如果没有需要检查Planned Quality列和上一班次的实际质量最后定位在哪里,然后将所有唯一的质量都获取到当前单元格,并检查当前实际质量是否包含在该单元格中选定的品质。

如果满足 2.1 或 2.2 中的任何一个条件>>>将“质量匹配”更新为 -1

3.) 否则,将“质量匹配”更新为 1

例如: 请检查单元格177,本班计划质量(质量A)和实际质量(质量B)不同,然后检查上一班的实际质量(质量C)也不是当前实际质量(B),然后需要检查当前班次之前的计划质量是否包括上一班实际质量(C),是的,它最后位于 166。然后获取所有独特的质量直到当前单元格(167 到 176),检查质量列表是否包含当前质量(质量 B),是的,然后将“质量匹配”更新为 -1。

最终预期输出:

样本数据集:

# import pandas library
import pandas as pd
from pandas import Timestamp
# dictionary with list object in values
details ={'Machine': {164: 'M22',
  165: 'M22',
  166: 'M22',
  167: 'M22',
  168: 'M22',
  169: 'M22',
  170: 'M22',
  171: 'M22',
  172: 'M22',
  173: 'M22',
  174: 'M22',
  175: 'M22',
  176: 'M22',
  177: 'M22',
  178: 'M22',
  179: 'M22'},
 'Start Time': {164: Timestamp('2021-05-31 07:00:00'),
  165: Timestamp('2021-05-31 08:11:12'),
  166: Timestamp('2021-05-31 08:46:12'),
  167: Timestamp('2021-05-31 12:00:00'),
  168: Timestamp('2021-05-31 19:00:00'),
  169: Timestamp('2021-06-01 07:00:00'),
  170: Timestamp('2021-06-01 19:00:00'),
  171: Timestamp('2021-06-02 07:00:00'),
  172: Timestamp('2021-06-02 19:00:00'),
  173: Timestamp('2021-06-02 19:00:00'),
  174: Timestamp('2021-06-03 07:00:00'),
  175: Timestamp('2021-06-03 19:00:00'),
  176: Timestamp('2021-06-04 07:00:00'),
  177: Timestamp('2021-06-04 14:38:42'),
  178: Timestamp('2021-06-04 14:39:27'),
  179: Timestamp('2021-06-04 19:00:00')},
 'End Time': {164: Timestamp('2021-05-31 08:11:12'),
  165: Timestamp('2021-05-31 08:46:12'),
  166: Timestamp('2021-05-31 12:00:00'),
  167: Timestamp('2021-05-31 19:00:00'),
  168: Timestamp('2021-06-01 07:00:00'),
  169: Timestamp('2021-06-01 19:00:00'),
  170: Timestamp('2021-06-02 07:00:00'),
  171: Timestamp('2021-06-02 19:00:00'),
  172: Timestamp('2021-06-02 19:00:00'),
  173: Timestamp('2021-06-03 07:00:00'),
  174: Timestamp('2021-06-03 19:00:00'),
  175: Timestamp('2021-06-04 07:00:00'),
  176: Timestamp('2021-06-04 14:38:42'),
  177: Timestamp('2021-06-04 14:39:27'),
  178: Timestamp('2021-06-04 19:00:00'),
  179: Timestamp('2021-06-05 07:00:00')},
 'shift': {164: 'Day',
  165: 'Day',
  166: 'Day',
  167: 'Day',
  168: 'Night',
  169: 'Day',
  170: 'Night',
  171: 'Day',
  172: 'Night',
  173: 'Night',
  174: 'Day',
  175: 'Night',
  176: 'Day',
  177: 'Day',
  178: 'Day',
  179: 'Night'},
 'Planned Quality': {164: 'C',
  165: 'C',
  166: 'C',
  167: 'B',
  168: 'B',
  169: 'B',
  170: 'B',
  171: 'B',
  172: 'B',
  173: 'A',
  174: 'A',
  175: 'A',
  176: 'A',
  177: 'A',
  178: 'A',
  179: 'A'},
 'Actual Quality': {164: 'D',
  165: 'DEFAULT',
  166: 'C',
  167: 'C',
  168: 'C',
  169: 'C',
  170: 'C',
  171: 'C',
  172: 'C',
  173: 'C',
  174: 'C',
  175: 'C',
  176: 'C',
  177: 'B',
  178: 'A',
  179: 'A'},
 'Planned Shift Production': {164: 75.87,
  165: 317.29,
  166: 206.51,
  167: 54.88,
  168: 258.5,
  169: 658.5,
  170: 658.5,
  171: 658.5,
  172: 743.13,
  173: 329.25,
  174: 658.5,
  175: 658.5,
  176: 419.52,
  177: 0.69,
  178: 238.29,
  179: 658.5},
 'Actual Shift Production': {164: 4.16,
  165: 0.0,
  166: 158.81,
  167: 173.13,
  168: 596.4,
  169: 805.03,
  170: 107.26,
  171: 0.0,
  172: 0.0,
  173: 0.0,
  174: 0.0,
  175: 122.78,
  176: 3323.42,
  177: 0.0,
  178: 2284.28,
  179: 686.7}}        



  
# creating a Dataframe object 
df = pd.DataFrame(details)
  
df

我的做法:

我尝试使用 np.select() 创建质量匹配列,但无法将 2.2 条件设置到我的代码中。

非常感谢您的支持!!!!!!!!!!!!

【问题讨论】:

    标签: python pandas dataframe numpy conditional-statements


    【解决方案1】:

    可能有更优雅的解决方案,但以下直截了当的方法应该可以满足您的需求:

    machine_list = df["Machine"].unique().tolist()
    
    for machine in machine_list:
        indices = df.index[df["Machine"]==machine].tolist()
        start_index = indices[0]
        end_index = indices[-1]
    
        for i, (planned, actual) in enumerate(zip(df.loc[start_index:,"Planned Quality"], df.loc[start_index:,"Actual Quality"]), start=start_index):
            if i > end_index:
                break
            if planned == actual:
                df.at[i, "Quality Match"] = 0
            elif i >= start_index + 1:
                if actual == df.at[i-1, "Actual Quality"]:
                    df.at[i, "Quality Match"] = -1
                elif i-2  >= start_index:
                    j = i-2
                    lst = []
                    while j >= start_index:
                        if df.at[j, "Planned Quality"] == df.at[i-1, "Actual Quality"]:
                            lst = [x for x in df.loc[j:i-1,"Planned Quality"]]
                            break
                        else:
                            j -= 1
    
                    if actual in lst:
                        df.at[i, "Quality Match"] = -1
                    else:
                        df.at[i, "Quality Match"] = 1
                else:
                    df.at[i, "Quality Match"] = 1
            else:
                df.at[i, "Quality Match"] = 1
    

    请注意,在我的建议中,我假设您的数据集是按机器名称排序的。

    【讨论】:

    • No Georgy,对于一个包含数百台机器的庞大数据集,还必须手动编码单元格值并不能带来预期的输出。程序应该能够自动识别以前的计划质量中是否存在任何当前质量,然后必须检查独特的质量。所以正如我提到的程序应该能够自动捕获它。不使用硬编码值
    • @domahc 您对硬编码值的看法完全正确,这对我来说很糟糕。我已经相应地更新了我的 sn-p。现在,它可以处理可变索引并适用于不同机器的数据集。让我知道这是否适合您。
    • 在第 12 号单元格中,df.at[i, "Quality Match"] = 0 是如何工作的,之前没有创建质量匹配列?代码可以完美运行。但是你能详细说明一下吗?我搜索 df.at 在它更新 df 的现有列特定给定位置。如果没有现有的质量匹配,这是如何工作的?
    • @domahc 使用 df.at[i, "Quality Match"] 会自动添加 "Quality Match" 列,如果它尚不存在。否则,它将对现有的"Quality Match" 列执行操作。 df.loc[i, "Quality Match"]df["Quality Match"] 也是如此。
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多