【问题标题】:creating a column in one table based on multiple columns from another table [python]基于另一个表中的多个列在一个表中创建一个列[python]
【发布时间】:2019-12-25 19:46:46
【问题描述】:

我正在创建一个 csv 表,其中包含有关我所有订单的信息。现在我想卖掉这些物品,但我想根据物品的价格添加额外的附加费。我用 surcharge 创建了一个新表,其中有名为“from”和“to”的列,我必须在其中比较商品价格,然后在销售价格中包含正确的附加费。

但我无法做到这一点。我尝试了不同的方法,但它们似乎都不起作用。任何帮助都会很好:)

我的桌子是这样的:

    OrderNo      NetPerPiece costsDividedPerOrder  HandlingPerPiece

0  7027514279        44.24     0.008007          0.354232

1  7027514279        15.93     0.008007          0.127552

2  7027514279        15.93     0.008007          0.127552

3  7027514279        15.93     0.008007          0.127552

4  7027514279        15.93     0.008007          0.127552
surcharges = {'surcharge': [0.35, 0.25, 0.2, 0.15, 0.12, 0.1],
'from': [0, 20, 200, 500, 1500, 5000], 
'to' : [20, 200, 500, 1500, 5000,1000000000] }
surchargeTable = DataFrame(surcharges, columns=['surcharge', 'from', 'to'])


productsPerOrder['NetPerpieceSale'] = numpy.where(((productsPerOrder['NetPerPiece'] >= surchargeTable['from']) & (productsPerOrder['NetPerPiece'] < surchargeTable['to'])), surchargeTable['surcharge'])


#I also tried this:

for index, row in productsPerOrder.iterrows():
        if row['NetPerPiece'] >= surchargeTable['from'] & row['NetPerPiece'] < surchargeTable['to']:
                productsPerOrder.loc[index,'NerPerPieceSale'] = surchargeTable.loc[row,'NetPerPieceSale'].values(0)

我希望它看起来像这样:

 OrderNo   NetPerPiece costsDividedPerOrder  HandlingPerPiece NetPerPieceSale

0  7027514279   44.24           0.008007          0.354232    0.25

1  7027514279   15.93           0.008007          0.127552    0.35

2  7027514279   15.93           0.008007          0.127552    0.35

3  7027514279   15.93           0.008007          0.127552    0.35

4  7027514279   15.93           0.008007          0.127552    0.35

提醒一下,包含项目的文件要大得多,我只显示了 csv 列表的头部。所以表格的长度不同

SurchargeTable 如下所示:

 surcharge  from          to
0       0.35     0          20
1       0.25    20         200
2       0.20   200         500
3       0.15   500        1500
4       0.12  1500        5000
5       0.10  5000  1000000000

【问题讨论】:

    标签: python pandas numpy csv


    【解决方案1】:

    创建一个函数来计算附加费,然后使用.apply 将其应用于“NetPerPiece”行。

    import pandas as pd
    df = pd.read_csv('something.csv')   
    
    def get_surcharges(x):
        to = [0, 20, 200, 500, 1500, 5000] 
        fr = [20, 200, 500, 1500, 5000,1000000000]
        surcharges = [0.35, 0.25, 0.2, 0.15, 0.12, 0.1]
        rr = list(zip(to, fr, surcharges))
        price = [r[2] for r in rr if x > r[0] and x <r[1]]
        return price[0]
    
    df['NetPerpieceSale'] = df['NetPerPiece'].apply(lambda x: get_surcharges(x))
    
    print(df)
    

    这个输出:

          OrderNo  NetPerPiece  costsDividedPerOrder  HandlingPerPiece  NetPerpieceSale
    0  7027514279        44.24              0.008007          0.354232             0.25
    1  7027514279        15.93              0.008007          0.127552             0.35
    2  7027514279        15.93              0.008007          0.127552             0.35
    3  7027514279        15.93              0.008007          0.127552             0.35
    4  7027514279        15.93              0.008007          0.127552             0.35
    

    没有 for 循环的选项(有点冗长):

    def get_surcharges(x):
        if x > 0:
            if x > 20:
                if x > 200:
                    if x > 500:
                        if x > 1500:
                            if x > 5000:
                                return 0.1
                            else:
                                return 0.12
                        else:
                            return 0.15
                    else:
                        return 0.2
                else:
                    return 0.25
            else:
                return 0.35
    

    【讨论】:

    • 感谢这个功能,我试过了,它可以工作,但是有没有 for-loop 的选项?
    • @AmilaBečirović 是的,已更新。虽然有点冗长
    • 感谢您的帮助,但是看起来太长了,我将使用@Scott 给出的带有地图和 IntervalIndex 的答案,它更快更容易理解
    • 我也会接受@Scott 的回答。更清洁!不过没问题!
    【解决方案2】:

    另一种方法是使用pd.IntervalIndexmap

    # Create IntervalIndex on surchageTable dataframe
    surchargeTable = surchargeTable.set_index(pd.IntervalIndex.from_arrays(surchargeTable['from'],
                                                                           surchargeTable['to']))
    
    #Use map to pd.Series created from surchargeTable IntervalIndex and surcharge column.
    productsPerOrder['NetPerPieceSale'] = productsPerOrder['NetPerPiece'].map(surchargeTable['surcharge'])
    
    productsPerOrder
    

    输出:

          OrderNo  NetPerPiece  costsDividedPerOrder  HandlingPerPiece  NetPerPieceSale
    0  7027514279        44.24              0.008007          0.354232             0.25
    1  7027514279        15.93              0.008007          0.127552             0.35
    2  7027514279        15.93              0.008007          0.127552             0.35
    3  7027514279        15.93              0.008007          0.127552             0.35
    4  7027514279        15.93              0.008007          0.127552             0.35
    

    【讨论】:

    • 感谢您的帮助,这可以快速解决问题
    【解决方案3】:

    使用上述 NetPerPieceScale 计算,只需向现有数据框添加一列
    或者您可以将计算保存到这样的数据框中:
    net=pd.DataFrame(NetPerPieceScale, columns=['NetPerPieceScale '])

    只需将其连接到现有的 Dataframe,您将在 1 个表中拥有所有内容

    【讨论】:

    • 表格的长度不同,我必须从主表格中将净价格与 surchargeTable 中的'from'和'to'进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2022-12-31
    • 2018-06-20
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多