Python 如何在pandas中按多个列值分组并应用ifelse来插补/计算值
我有一个数据帧df,如下所示Python 如何在pandas中按多个列值分组并应用ifelse来插补/计算值,python,r,pandas,numpy,pandas-groupby,Python,R,Pandas,Numpy,Pandas Groupby,我有一个数据帧df,如下所示 Node COMMODITY_CODE DAY Capacity_Case Capacity_Delivery case_ratio deliveries_ratio window_count 7014.0 SCFZ 1 26610.0 12.0 0.357854 0.354839. 3 7014.0 SCFZ 2 25551.0 1
Node COMMODITY_CODE DAY Capacity_Case Capacity_Delivery case_ratio deliveries_ratio window_count
7014.0 SCFZ 1 26610.0 12.0 0.357854 0.354839. 3
7014.0 SCFZ 2 25551.0 11.0 0.457945 0.423077 3
7014.0 SCFZ 3 30669.0 13.0 0.283379 0.258621 3
7030.0 SCDD 1 34244.0 16.0 0.316505 0.300000 4
7030.0 SCDD 2 25954.0 13.0 0.236513 0.232558 4
我想按节点、日期、商品代码分组,并应用ifelse函数为空记录插补值。
我的条件如下:
df %>%
group_by(Node, DAY_OF_WK, COMMODITY_CODE) %>%
mutate(delivery_ratio_filled = ifelse(!is.na(delivery_ratio),
delivery_ratio,
mean(delivery_ratio)),
case_ratio_filled = ifelse(!is.na(case_ratio),
case_ratio,
mean(case_ratio))) %>%
mutate(delivery_ratio_filled = ifelse(!is.na(delivery_ratio_filled),
delivery_ratio_filled,
1.0 / window_count),
case_ratio_filled = ifelse(!is.na(case_ratio_filled),
case_ratio_filled,
1.0 / window_count))
不幸的是,示例输入数据不包含将被计算值替换的
na
值(或大于一项的组)。因此,新列是原始列的简单副本
第一个条件可以用测试并应用于每一行
第二个条件不需要分组
df['delivery_ratio_filled'] = (
np.where(df['delivery_ratio_filled'].isna(),
1 / df['window_count'],
df['delivery_ratio_filled']))
df['case_ratio_filled'] = (
np.where(df['case_ratio_filled'].isna(),
1 / df['window_count'],
df['case_ratio_filled']))
df
输出:
您也可以在python中以
dplyr
的方式执行此操作:
>>>来自datar.所有导入的f,tribble,groupby,mutate,if-else,is-na,mean
>>>
>>>df=tribble(
…f.节点、f.商品代码、f.日期、f.容量箱、f.容量箱、f.容量箱、f.容量箱、f.比率、f.比率、f.窗口计数、,
…7014.0,“SCFZ”,126610.0,12.0,0.357854,0.354839,3,
…7014.0,“SCFZ”,22551.0,11.0,0.457945,0.423077,3,
…7014.0,“SCFZ”,330669.0,13.0,0.283379,0.258621,3,
…7030.0,“SCDD”,134244.0,16.0,0.316505,0.300000,4,
…7030.0,“SCDD”,225954.0,13.0,0.236513,0.232558,4,
... )
>>>
>>>
>>>df>>\
... 分组依据(f.节点、f.日期、f.商品代码)>>\
... 变异(交付率=如果其他(~is\u na(f.交付率),
…f.交货率,
…平均值(f.交货率),
…case_ratio_filled=如果_else(~is_na(f.case_ratio)),
…f.情况比,
…平均值(f.case_比率))>>\
... 变异(交付率填充=如果其他(~is_na(f.交付率填充),
…f.交货率,
…1.0/f.窗口(计数),
…case\u ratio\u filled=if\u else(~is\u na(f.case\u ratio\u filled),
…f.已填充的案例比率,
…1.0/f.窗口(U计数)
节点商品\代码日容量\案例容量\发货案例\比率发货\比率窗口\盘点发货\比率已填充案例\比率已填充
0 7014.0 SCFZ 1 26610.0 12.0 0 0.357854 0.354839 3 0.354839 0.357854
1 7014.0 SCFZ 2 25551.0 11.0 0 0.457945 0.423077 3 0.423077 0.457945
2 7014.0 SCFZ 3 30669.0 13.0 0 0.283379 0.258621 3 0.258621 0.283379
3 7030.0 SCDD 1 34244.0 16.0 0 0.316505 0.300000 4 0.300000 0 0.316505
47030.0 SCDD 2 25954.0 13.0 0 0.236513 0.232558 4 0.232558 0.236513
[组:节点、日期、商品代码(n=5)]
我是这个包裹的作者。如果您有任何问题,请随时提交问题。您的条件和期望的输出是什么?@MichaelSzczesny使用测试数据的期望条件更新了问题,当前输出和期望的输出是什么?您的示例数据包含无效的浮动,并且不包含测试条件的所有案例(列中没有
na
值)。
df['delivery_ratio_filled'] = (
np.where(df['delivery_ratio_filled'].isna(),
1 / df['window_count'],
df['delivery_ratio_filled']))
df['case_ratio_filled'] = (
np.where(df['case_ratio_filled'].isna(),
1 / df['window_count'],
df['case_ratio_filled']))
df
Node COMMODITY_CODE ... delivery_ratio_filled case_ratio_filled
0 7014.0 SCFZ ... 0.354839 0.357854
1 7014.0 SCFZ ... 0.423077 0.457945
2 7014.0 SCFZ ... 0.258621 0.283379
3 7030.0 SCDD ... 0.300000 0.316505
4 7030.0 SCDD ... 0.232558 0.236513