根据条件将新列添加到Multi Index DataFrame

时间:2020-08-24 18:01:12

标签: python pandas numpy

我有一个MultiIndex数据帧,该数据帧由一个索引组成,该索引由商店的地址和订单的状态组成。这些值由与订单状态相对应的订单数量组成。因此,例如,一家商店可能有6个已交付订单和2个已取消订单。

我想创建一个新列,该列基于已取消订单的数量(相对于订单数量)来计算百分比。我将如何处理?例如,如果没有取消的订单,则百分比为0。

表格示例:

store_address   final_status    number_of_orders
190             DeliveredStatus 10
191             DeliveredStatus 8
193             CanceledStatus  1
                DeliveredStatus 1
194             DeliveredStatus 12

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以尝试。

import pandas as pd
import numpy as np

ll=[{'data': 'alex','d':3,'c':0},{'data': 'bc','d':2,'c':1},{'data': 'x','d':4,'c':1},{'data': 'ex','d':1,'c':1}]

df=pd.DataFrame(ll)
df['pct']=np.where(df['c']==0, 0, (df['c']/(df['d']+df['c']))*100)
print(df)

答案 1 :(得分:0)

因此,此样本df

df = pd.read_fwf(StringIO(
'''store_address   final_status    number_of_orders
190             DeliveredStatus 10
191             DeliveredStatus 8
193             CanceledStatus  1
193             DeliveredStatus 1
194             DeliveredStatus 12''')).set_index(['store_address', 'final_status'])

您可以取消堆叠final_status,因此它是列索引而不是行索引的一部分。然后,您可以轻松获得百分比。

df = df.squeeze().unstack(fill_value=0)
df['cancelled_rate'] = df.CanceledStatus.div(df.sum(axis=1))

输出

final_status   CanceledStatus  DeliveredStatus  cancelled_rate
store_address
190                         0               10             0.0
191                         0                8             0.0
193                         1                1             0.5
194                         0               12             0.0

答案 2 :(得分:0)

假设您的起始df如下所示:

                               number_of_orders
store_address final_status                     
190           DeliveredStatus                10
191           DeliveredStatus                 8
193           CanceledStatus                  1
              DeliveredStatus                 1
194           DeliveredStatus                12

执行以下操作:

# unstack final_status and fill_value with 0
df_unstacked = df.unstack(fill_value=0)

print(df_unstacked)

              number_of_orders                
final_status    CanceledStatus DeliveredStatus
store_address                                 
190                          0              10
191                          0               8
193                          1               1
194                          0              12

# calculate CanceledProportion
df_unstacked['CanceledProportion'] = df_unstacked.number_of_orders.CanceledStatus / df_unstacked.sum(axis=1)

print(df_unstacked)

              number_of_orders                 CanceledProportion
final_status    CanceledStatus DeliveredStatus                   
store_address                                                    
190                          0              10                0.0
191                          0               8                0.0
193                          1               1                0.5
194                          0              12                0.0