Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中按多个列值分组并应用ifelse来插补/计算值_Python_R_Pandas_Numpy_Pandas Groupby - Fatal编程技术网

Python 如何在pandas中按多个列值分组并应用ifelse来插补/计算值

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

我有一个数据帧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         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函数为空记录插补值。 我的条件如下:

  • 对于组(节点、日期、商品代码)

  • 如果交货率为空 然后我想替换为组的平均值(交货率),并将其分配给交货率
  • 如果case_比率为空 然后我想替换为组的平均值(case_ratio),并将其分配给case_ratio
  • 如果为组(节点、日期、商品代码)

  • 交货率填充为空,然后为其分配1/窗口计数值
  • 案例比率填充为空,然后为其分配1/窗口计数
  • 我已经使用dplyr包轻松地在R中完成了这一点,我基本上希望在Python中使用pandas

    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