考虑以下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问题,但是我对此特定行为的根源非常好奇。
答案 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