根据其他单元格的内容将数据添加到列(Python / Excel)

时间:2020-05-18 13:04:18

标签: python excel pandas numpy

大家

我正在尝试自动分配广告资源。由于我不是一位经验丰富的程序员,因此在创建逻辑上存在困难。

目标是合并两个Excel文件并添加一列,其中包含负责人/部门。到目前为止,我管理的是合并Excel文件并添加“ Reviser”列。现在,此列必须由合适的人员/部门填写。

这背后的逻辑不是很困难,但是我真的不知道如何使用Python / Pandas等来做到这一点。 我已经尝试使用np.where解决此问题,但这不能完全解决问题。

在这里您可以看到分配修改器的逻辑:

[分配后的逻辑] [1]

感谢您的帮助!

我当前的代码:

import pandas as pd
import numpy as np
from openpyxl import Workbook

Q_Stock = pd.read_excel("C:\\Users\\Lucas\\Desktop\\Excel_Test\\Q Bestand.xlsx",usecols=["Bestandsqualifikation", "Inhalt", "Benutzerfeld 1", "Benutzerfeld 2","Material", "Externer Barcode 2", "Handling Unit"])
""" Q_Bestand["Bearbeiter"] = "" """
Q_Stocknew = Q_Stock[0:-1]

S_Stock = pd.read_excel("C:\\Users\\Lucas\\Desktop\\Excel_Test\\S Bestand.xlsx",usecols=["Bestandsqualifikation", "Inhalt", "Benutzerfeld 1", "Benutzerfeld 2","Material", "Externer Barcode 2", "Handling Unit" ])
""" S_Bestand["Bearbeiter"] = "" """
S_Stocknew = S_Stock[0:-1]


complete_list = [S_Stocknew, Q_Stocknew]

Combined = pd.concat(complete_list)
df = pd.DataFrame
def bar(df):
    if Combined['Inhalt'] ==np.nan:
        return np.nan
    elif str(Combined['Inhalt']).contains("QV"):
        return "Distribution"
    elif str(Combined['Inhalt']).contains("QP"):
        return "Production"
    elif (Combined['Benutzerfeld 2'] == "ruckschnitt") and (str(Combined['Material']).contains("^09")):
        return "Person 1"
df["Reviser"] = Combined.apply(bar, axis = 1)





Combined.to_excel(r'C:\\Users\Lucas\\Desktop\\Excel_Test\\Test.xlsx', index = True)

现在哪个抛出此错误:

C:\ Python \ Code \ venv \ Scripts \ python.exe C:/Python/Code/SAP_Automatisieren.py 追溯(最近一次通话): 文件“ C:/Python/Code/SAP_Automatisieren.py”,第29行,在 df [“ Reviser”] = Combined.apply(bar,axis = 1) 申请中的文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ frame.py”,行6878 返回op.get_result() get_result中的第186行的文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ apply.py” 返回self.apply_standard() 文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ apply.py”,第295行,位于apply_standard中 结果= libreduction.compute_reduction( 在pandas._libs.reduction.compute_reduction中的文件“ pandas_libs \ reduction.pyx”,第620行 在pandas._libs.reduction.Reducer.get_result中的文件“ pandas_libs \ reduction.pyx”,第128行 文件“ C:/Python/Code/SAP_Automatisieren.py”,第19行,在栏中 如果Combined ['Inhalt'] == np.nan: 非零中的文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ generic.py”,行1478 引发ValueError( ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

import pandas as pd
import numpy as np
from openpyxl import Workbook

Q_Stock = pd.read_excel("C:\\Users\\Lucas\\Desktop\\Excel_Test\\Q Bestand.xlsx",usecols=["Bestandsqualifikation", "Inhalt", "Benutzerfeld 1", "Benutzerfeld 2","Material", "Externer Barcode 2", "Handling Unit"])
""" Q_Bestand["Bearbeiter"] = "" """
Q_Stocknew = Q_Stock[0:-1]

S_Stock = pd.read_excel("C:\\Users\\Lucas\\Desktop\\Excel_Test\\S Bestand.xlsx",usecols=["Bestandsqualifikation", "Inhalt", "Benutzerfeld 1", "Benutzerfeld 2","Material", "Externer Barcode 2", "Handling Unit" ])
""" S_Bestand["Bearbeiter"] = "" """
S_Stocknew = S_Stock[0:-1]


complete_list = [S_Stocknew, Q_Stocknew]

Combined = pd.concat(complete_list)
df = pd.DataFrame
def bar(Combined):
    if Combined['Inhalt'] ==np.nan:
        return np.nan
    elif str(Combined['Inhalt']).contains("QV"):
        return "Distribution"
    elif str(Combined['Inhalt']).contains("QP"):
        return "Production"
    elif (Combined['Benutzerfeld 2'] == "ruckschnitt") and (str(Combined['Material']).contains("^09")):
        return "Person 1"

df["Reviser"] = Combined.apply(bar, axis = 1)


错误:

C:\ Python \ Code \ venv \ Scripts \ python.exe C:/Python/Code/SAP_Automatisieren.py 追溯(最近一次通话): 文件“ C:/Python/Code/SAP_Automatisieren.py”,第28行,在 df [“ Reviser”] = Combined.apply(bar,axis = 1) 申请中的文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ frame.py”,行6878 返回op.get_result() get_result中的第186行的文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ apply.py” 返回self.apply_standard() 文件“ C:\ Python \ Code \ venv \ lib \ site-packages \ pandas \ core \ apply.py”,第295行,位于apply_standard中 结果= libreduction.compute_reduction( 在pandas._libs.reduction.compute_reduction中的文件“ pandas_libs \ reduction.pyx”,第620行 在pandas._libs.reduction.Reducer.get_result中的文件“ pandas_libs \ reduction.pyx”,第128行 栏中的文件“ C:/Python/Code/SAP_Automatisieren.py”,第21行 elif str(Combined ['Inhalt'])。contains(“ QV”): AttributeError:“ str”对象没有属性“ contains”

1 个答案:

答案 0 :(得分:0)

您可以编写如下函数并将其应用于数据框。您还可以编写嵌套的np.where,但是来自Excel世界的以下函数对您来说更易读

def bar(df):
    if df['Inventory Qualifikation'] ==np.nan:
        return np.nan
    elif str(df['Inventory Qualifikation']).contains("QV"):
        return "Distribution"
    elif str(df['Inventory Qualifikation']).contains("QP"):
        return "Production"
    elif (df['Userfield 2'] == "ruckschnitt") and (str(df['material']).contains("^09")):
    return "Person 1"

df['reviser'] = df.apply(bar, axis = 1)