熊猫应用返回:使用可迭代设置时必须具有相等的 len 键和值

数据挖掘 Python 熊猫 数据框
2021-10-12 23:38:18

我有我的代码,我想在其中应用一个函数并根据返回数据覆盖输入,这是我的apply部分

panda_dataframe[[
    'distributor-stock-cost-price-real-distributor',
    'distributor-stock-cost-price-stock',
    'distributor-stock-cost-price-expected',
    'distributor-stock-cost-price-country',
    'distributor-stock-cost-price-real-distributor',
    'distributor-stock-cost-price-real-stock',
    'distributor-stock-cost-price-real-expected',
    'distributor-stock-cost-price-real-country'
]] = panda_dataframe[['uuid']].apply(lambda x:__getDistributorStockData(x))

然后我得到了我应用到我的数据框的函数。

def __getDistributorStockData(x):
    in_product_uuid = x


    out_cost_price_dist = None
    out_cost_price_stock = None
    out_cost_price_expected = None
    out_cost_price_country = None
    out_cost_price_real_dist = None
    out_cost_price_real_stock = None
    out_cost_price_real_expected = None
    out_cost_price_real_country = None


    try:
        product_data = store_remote_stock_dataframe.get_group(in_product_uuid)

        product_data_onstock = product_data.loc[product_data['Stock'] > 0, ['Stock', 'CostPriceReal', 'CostPrice', 'Expected', 'DistributorUUID', 'Country']]
        product_data_outstock = product_data.loc[product_data['Stock'] <= 0, ['Stock', 'CostPriceReal', 'CostPrice', 'Expected', 'DistributorUUID', 'Country']]

        if len(product_data_onstock) > 0:
            stock_cost_price = product_data_onstock.sort_values(by=['CostPrice'], ascending=True).iloc[0,:]
            stock_cost_real_price = product_data_onstock.sort_values(by=['CostPriceReal'], ascending=True).iloc[0,:]

            out_cost_price_dist = stock_cost_price['DistributorUUID']
            out_cost_price_stock = stock_cost_price['Stock']
            out_cost_price_expected =  stock_cost_price['Expected']
            out_cost_price_country =  stock_cost_price['Country']
            out_cost_price_real_dist = stock_cost_real_price['DistributorUUID']
            out_cost_price_real_stock = stock_cost_real_price['Stock']
            out_cost_price_real_expected = stock_cost_real_price['Expected']
            out_cost_price_real_country = stock_cost_real_price['Country']

        elif len(product_data_outstock) > 0:
            stock_cost_price = product_data_outstock.sort_values(by=['CostPrice'], ascending=True).iloc[0,:]
            stock_cost_real_price = product_data_outstock.sort_values(by=['CostPriceReal'], ascending=True).iloc[0,:]

            out_cost_price_dist = stock_cost_price['DistributorUUID']
            out_cost_price_stock = stock_cost_price['Stock']
            out_cost_price_expected =  stock_cost_price['Expected']
            out_cost_price_country =  stock_cost_price['Country']
            out_cost_price_real_dist = stock_cost_real_price['DistributorUUID']
            out_cost_price_real_stock = stock_cost_real_price['Stock']
            out_cost_price_real_expected = stock_cost_real_price['Expected']
            out_cost_price_real_country = stock_cost_real_price['Country']
        else:
            stock_cost_price = None
            stock_cost_real_price = None
    except:
        stock_cost_price = None
        stock_cost_real_price = None

    return [
        out_cost_price_dist,
        out_cost_price_stock,
        out_cost_price_expected,
        out_cost_price_country,
        out_cost_price_real_dist,
        out_cost_price_real_stock,
        out_cost_price_real_expected,
        out_cost_price_real_country
    ]

我的大问题是一切都运行良好,我已经在单行上尝试过了,它工作正常,但它返回到一个数组中,现在我想将它应用到每一行但我得到了这个错误。

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    pricerule_calculate_run = PriceruleCalculate.run(method='business')
  File ".....", line 940, in run
    __setupProducts(productUUID)
  File ".....", line 507, in __setupProducts
    ]] = panda_dataframe[['uuid']].apply(lambda x:__getDistributorStockData(x), axis=1)
  File "/usr/local/lib/python3.6/site-packages/pandas/core/frame.py", line 2514, in __setitem__
    self._setitem_array(key, value)
  File "/usr/local/lib/python3.6/site-packages/pandas/core/frame.py", line 2544, in _setitem_array
    self.loc._setitem_with_indexer((slice(None), indexer), value)
  File "/usr/local/lib/python3.6/site-packages/pandas/core/indexing.py", line 599, in _setitem_with_indexer
    raise ValueError('Must have equal len keys and value '
ValueError: Must have equal len keys and value when setting with an iterable

可以在这里帮助我找到我的错误吗,我对 Pandas 还是很陌生,我正在优化我的数据处理程序。

1个回答

我发现了问题,我需要返回一个 pd.Series()

return pd.Series([
    out_cost_price_dist,
    out_cost_price_stock,
    out_cost_price_expected,
    out_cost_price_country,
    out_cost_price_real_dist,
    out_cost_price_real_stock,
    out_cost_price_real_expected,
    out_cost_price_real_country
])