我有一个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
谢谢!
答案 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