在groupby函数重复列中应用tail

时间:2019-03-16 10:46:02

标签: python pandas

考虑以下MVCE

import pandas as pd

data_in = [
  { 'company': 'A', 'time': 1552521600, 'interval': 'day',     'violations': 3, 'handled': 1800 },
  { 'company': 'A', 'time': 1552521600, 'interval': 'hour',    'violations': 0, 'handled': 400 },
  { 'company': 'A', 'time': 1552526100, 'interval': 'quarter', 'violations': 0, 'handled': 100 },
  { 'company': 'A', 'time': 1552528800, 'interval': 'hour',    'violations': 0, 'handled': 20 },

  { 'company': 'B', 'time': 1552521600, 'interval': 'hour', 'violations': 1, 'handled': 200 },
  { 'company': 'B', 'time': 1552525200, 'interval': 'hour', 'violations': 1, 'handled': 200 },
  { 'company': 'B', 'time': 1552526100, 'interval': 'quarter', 'violations': 0, 'handled': 50 },
  { 'company': 'B', 'time': 1552521600, 'interval': 'day', 'violations': 4, 'handled': 1400 },
]

df = pd.DataFrame(data_in).set_index(['company', 'time'])
df.sort_index(axis=0, inplace=True)

pv = df.pivot_table(index=['company', 'time'], columns='interval')
pv = pv.groupby(level=['company']).apply(lambda o: o.ffill()).groupby(level=['company']).tail(1)
print(pv)

哪些印刷品

                   handled                violations
interval               day   hour quarter        day hour quarter
company time
A       1552528800  1800.0   20.0   100.0        3.0  0.0     0.0
B       1552526100  1400.0  200.0    50.0        4.0  1.0     0.0

我正在尝试确定是否可以在单个groupby中应用多个操作。我认为这应该可行:

pv = pv.groupby(level=['company']).apply(lambda o: o.ffill().tail(1))

几乎 都做同样的事情,但是最终复制了我分组的列。

                           handled                violations
interval                       day   hour quarter        day hour quarter
company company time
A       A       1552528800  1800.0   20.0   100.0        3.0  0.0     0.0
B       B       1552526100  1400.0  200.0    50.0        4.0  1.0     0.0

如何防止其复制列?

我知道这是一个X / Y问题,但是我对此特定行为的根源非常好奇。

1 个答案:

答案 0 :(得分:1)

为避免此行为,必须在DataFrame.groupby中使用参数group_keys=False

  

group_keys:bool,默认为 True

     

在调用apply时,将组键添加到索引以识别片段。

pv = pv.groupby(level=['company'], group_keys=False).apply(lambda o: o.ffill().tail(1))
print (pv)
                   handled                violations             
interval               day   hour quarter        day hour quarter
company time                                                     
A       1552528800  1800.0   20.0   100.0        3.0  0.0     0.0
B       1552526100  1400.0  200.0    50.0        4.0  1.0     0.0