跨行

时间:2018-04-23 19:32:02

标签: python pandas row

我有如下数据。我想标记交易 -

当同一员工在同一天拥有'Car Rental', 'Car Rental - Gas'列中的expense type'Car Mileage'之一时 - 所以在这种情况下,员工a和{{ 1}}的交易将突出显示。员工c的交易不会突出显示,因为他们不符合条件 - 他没有b

我想要列'Car Mileage'。该列中的不同数字表示满足上述条件时的实例组

zflag

如果我能获得有关要使用的功能的指示,我将不胜感激。我正在考虑使用groupby ......但不确定

我了解d = {'emp': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c' ], 'date': ['1', '1', '1', '1', '2', '2', '2', '3', '3', '3', '3' ], 'usd':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], 'expense type':['Car Mileage', 'Car Rental', 'Car Rental - Gas', 'food', 'Car Rental', 'Car Rental - Gas', 'food', 'Car Mileage', 'Car Rental', 'food', 'wine' ], 'zflag':['1', '1', '1', ' ',' ',' ',' ','2','2',' ',' ' ] } df = pd.DataFrame(data=d) df Out[253]: date emp expense type usd zflag 0 1 a Car Mileage 1 1 1 1 a Car Rental 2 1 2 1 a Car Rental - Gas 3 1 3 1 a food 4 4 2 b Car Rental 5 5 2 b Car Rental - Gas 6 6 2 b food 7 7 3 c Car Mileage 8 2 8 3 c Car Rental 9 2 9 3 c food 10 10 3 c wine 11 + date将是我的主要关键

1 个答案:

答案 0 :(得分:1)

这是一种方法。它不是最干净的,但你所描述的是非常具体的。其中一些可能可以通过函数进行简化。

temp_df = df.groupby(["emp", "date"], axis=0)["expense type"].apply(lambda x: 1 if "Car Mileage" in x.values and any([k in x.values for k in ["Car Rental", "Car Rental - Gas"]]) else 0).rename("zzflag")
temp_df = temp_df.loc[temp_df!=0,:].cumsum()
final_df = pd.merge(df, temp_df.reset_index(), how="left").fillna(0)

步骤:

  • 分组emp / date并搜索条件,如果满足则为1,否则为0

  • 删除包含0' s和cumsum的行以生成唯一值

  • 加入原始框架

修改

回答下面的问题。加入是有效的,因为在您运行.reset_index()之后需要" emp"和"日期"从索引中移动它们到列。