Pandas groupby并计算百分比,同时保持NaN

时间:2017-08-16 15:26:59

标签: python pandas

我有订单ID和频道的df。

all_data_filtered = all_data[["order_id", "user_channel"]]
all_data_filtered.head(100).to_dict()

将此作为字典提供给某人,以便能够使用pd.DataFrame(dict_bellow)轻松复制它:

    {'order_id': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan,
  10: nan,
  11: nan,
  12: nan,
  13: 7026578.0,
  14: 7026584.0,
  15: 7026890.0,
  16: 7026959.0,
  17: 7027028.0,
  18: 7027109.0,
  19: 7027175.0,
  20: 7027193.0,
  21: nan,
  22: nan,
  23: nan,
  24: nan,
  25: nan,
  26: nan,
  27: nan,
  28: nan,
  29: nan,
  30: nan,
  31: 7026635.0,
  32: 7026842.0,
  33: nan,
  34: nan,
  35: nan,
  36: nan,
  37: nan,
  38: nan,
  39: nan,
  40: nan,
  41: nan,
  42: nan,
  43: nan,
  44: nan,
  45: 7026923.0,
  46: nan,
  47: nan,
  48: nan,
  49: nan,
  50: nan,
  51: nan,
  52: nan,
  53: nan,
  54: nan,
  55: nan,
  56: 7026662.0,
  57: 7026677.0,
  58: nan,
  59: nan,
  60: 7722035.0,
  61: nan,
  62: 7026686.0,
  63: 7026695.0,
  64: nan,
  65: 7028045.0,
  66: 7026698.0,
  67: 7026701.0,
  68: 7026740.0,
  69: 7026743.0,
  70: 7033025.0,
  71: nan,
  72: nan,
  73: nan,
  74: nan,
  75: 7584236.0,
  76: 7584395.0,
  77: nan,
  78: nan,
  79: nan,
  80: nan,
  81: nan,
  82: nan,
  83: nan,
  84: nan,
  85: 7026761.0,
  86: 7027055.0,
  87: 7026755.0,
  88: 7026758.0,
  89: 7027709.0,
  90: nan,
  91: nan,
  92: nan,
  93: nan,
  94: nan,
  95: 7026764.0,
  96: 7026824.0,
  97: 7033052.0,
  98: 7033112.0,
  99: 7033349.0},
 'user_channel': {0: 1,
  1: 2,
  2: 3,
  3: 1,
  4: 3,
  5: 3,
  6: 1,
  7: 3,
  8: 4,
  9: 1,
  10: 4,
  11: 2,
  12: 3,
  13: 3,
  14: 3,
  15: 3,
  16: 3,
  17: 3,
  18: 3,
  19: 3,
  20: 3,
  21: 3,
  22: 1,
  23: 1,
  24: 3,
  25: 1,
  26: 1,
  27: 1,
  28: 1,
  29: 3,
  30: 1,
  31: 3,
  32: 3,
  33: 3,
  34: 1,
  35: 3,
  36: 3,
  37: 2,
  38: 2,
  39: 3,
  40: 3,
  41: 1,
  42: 1,
  43: 2,
  44: 5,
  45: 5,
  46: 3,
  47: 2,
  48: 3,
  49: 3,
  50: 3,
  51: 1,
  52: 1,
  53: 3,
  54: 3,
  55: 3,
  56: 3,
  57: 3,
  58: 1,
  59: 1,
  60: 6,
  61: 3,
  62: 3,
  63: 3,
  64: 3,
  65: 3,
  66: 4,
  67: 4,
  68: 4,
  69: 4,
  70: 4,
  71: 3,
  72: 3,
  73: 1,
  74: 1,
  75: 3,
  76: 3,
  77: 3,
  78: 3,
  79: 3,
  80: 1,
  81: 3,
  82: 3,
  83: 4,
  84: 3,
  85: 3,
  86: 3,
  87: 4,
  88: 4,
  89: 4,
  90: 1,
  91: 3,
  92: 3,
  93: 5,
  94: 3,
  95: 3,
  96: 3,
  97: 3,
  98: 3,
  99: 3}}

这些是个别订单。所以我试着把它们分组并计算它们:

all_data_filtered.groupby(["user_channel"]).agg(['count'])

给出了这个并且很有用,因为我知道通过第3频道获得的订单最多:

               order_id
               count
user_channel    
1   391
2   211
3   1805
4   425
5   102
6   124
7   159

但是这些排除了所有NaN(通过频道并且未提交订单的用户)。因此,最终我可以得到一些百分比:通过渠道3来了90%的用户,10%的用户下了订单,占所有订单的40%。如何包含NaN以便我可以计算百分比?

1 个答案:

答案 0 :(得分:3)

尝试使用.agg('size')。

df.groupby('user_channel').agg('size')

user_channel
1    22
2     6
3    57
4    11
5     3
6     1
dtype: int64

对战

df.groupby('user_channel').agg('count')
             order_id

user_channel          
1                    0
2                    0
3                   24
4                    8
5                    1
6                    1