迭代数据帧并根据字典条件进行更新

问题描述 投票:3回答:2

我有以下需要处理的xlsx文件:

我想迭代数据帧,如果列ITEM CODE包含字典键,我想检查同一行,如果包含字典值[0](元组中的第一个位置),如果包含我想插入字典值1 (元组中的第二个位置)到另一个名为SKU的列中

数据帧:#df3 = df2.append(df1)enter image description here

catp = {"2755":(('24','002'),('25','003'),('26','003'),('27','004'),('28','005'),('29','006'),('30','007'),('31','008'),
                ('32','009'),('32','010'),('33','011'),('34','012'),('35','013'),('36','014')),
        "2513":(('38','002'),('40','003'),('42','004'),('44','005'),('46','006'),('48','007'),('50','008'),('52','009'),
               ('54','010'))}

for i, row in df3.iterrows():
    if catp.key() in df3['ITEM CODE'][i] and catp.value()[0] in df3['TG'][i]:
            codmarime = catp.value()[1]
            df3['SKU'][i] = '20'+df3['ITEM CODE'][i]+[i]+codmarime

    else:
        df3['SKU'][i] = '20'+df3['ITEM CODE'][i]+'???'

如果2755和24发现SKU ='202755638002'

如果2513和44发现SKU ='202513123005'

输出xlsx enter image description here

python pandas xlsx
2个回答
1
投票

由于您未能提供文本数据来创建至少一个DataFrame的片段,我从您的图片中复制了3行,创建了我的测试DataFrame:

df3 = pd.DataFrame(data=[
    [ '1513452', 'AVRO D2', '685', 'BLACK/BLACK/ANTRACITE', '24', 929.95, '8052644627565' ],
    [ '2513452', 'AVRO D2', '685', 'BLACK/BLACK/ANTRACITE', '21', 929.95, '8052644627565' ],
    [ '2755126', 'AMELIA',  'Y17', 'DARK-DENIM',            '24', 179.95, '8052644627565' ]],
    columns=[ 'ITEM CODE', 'ITEM', 'COLOR', 'COLOR CODE', 'TG', 'PRICE', 'EAN' ])

细节:

  • 第一行不包含catp列中的任何ITEM CODE键。
  • 第二行:ITEM CODE包含您的一个代码(2513)但是对于TG列,没有在2513下保存的元组包含第一个元素== 21。
  • 第三行:ITEM CODE包含您的一个代码(2755),TG == 24,在2755下保存的元组中有一个== 24。

然后我们必须定义几个辅助功能:

def findContainedCodeAndVal(dct, str):
    for eachKey in dct.keys():
        if str.find(eachKey) >= 0:
            return (eachKey, dct[eachKey])
    else:
        return (None, None)

此函数试图在dct中找到str中包含的密钥。它返回一个包含找到的密钥和来自dct的相关值的2元组。

def find2ndElem(tuples, str):
    for tpl in tuples:
        if tpl[0] == str:
            return tpl[1]
    else:
        return ''

此函数检查来自tuples的每个元组是否其第一个元素== str并返回此元组中的第二个元素。

最后定义的函数是一个应用于DataFrame中每一行的函数。它返回要在SKU列中保存的值:

def fn(row):
    ind = row.name  # Read row index
    iCode = row['ITEM CODE']
    k, val = findContainedCodeAndVal(catp, iCode)
    codmarime = ''
    if k:
        tg = row.TG
        codmarime = find2ndElem(val, tg)
    if codmarime == '':
        codmarime = '???'
    return f'20/{iCode}/{ind}/{codmarime}'

请注意,它使用您的catp字典。

出于演示目的,我在返回值中引入了额外的斜杠,将相邻的部分分开。在目标版本中删除它们。

最后要做的是计算DataFrame的SKU列,将fn函数应用于df3的每一行并将结果保存在SKU列下:

df3['SKU'] = df3.apply(fn, axis=1)

当您打印DataFrame(包含我的测试数据)时,qazxsw poi列将包含:

SKU

0
投票

我无法正确理解这个问题,只是纠正了我在代码中看到的错误:

20/1513452/0/??? 20/2513452/1/??? 20/2755126/2/002

这是不正确的。

如果我了解最终目标,我会采取不同的方法

if catp.key() in df3['ITEM CODE'][i] and catp.value()[0] in df3['TG'][i]:
© www.soinside.com 2019 - 2024. All rights reserved.