Python 跨行标记事务

Python 跨行标记事务,python,pandas,row,Python,Pandas,Row,我有一个数据如下。我想标记交易- 当同一名员工在同一天拥有('Car Rental'、费用类型中的'Car Rental-Gas')和'Car miliner'中的一项时,因此在这种情况下,员工的a和c交易将突出显示。员工b的交易不会突出显示,因为这些交易不符合条件-他没有“汽车里程” 我想要列zflag。该列中的不同数字表示满足上述条件时的实例组 d = {'emp': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c',

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

当同一名员工在同一天拥有(
'Car Rental'、
费用类型中的
'Car Rental-Gas'
)和
'Car miliner'
中的一项时,因此在这种情况下,员工的
a
c
交易将突出显示。员工
b
的交易不会突出显示,因为这些交易不符合条件-他没有
“汽车里程”

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

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      
如果我能得到关于要使用的函数的指针,我将不胜感激。我正在考虑使用groupby…但不确定


我知道
date
+
emp
将是我的主键

以下是一种方法。这不是最干净的,但你描述的很具体。其中一些可以通过函数简化

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/日期分组并搜索条件,如果满足,则为1,如果不满足,则为0

  • 删除具有0和cumsum的行以生成唯一值

  • 重新连接到原始帧

编辑:


来回答你下面的问题。连接之所以有效,是因为在运行
.reset_index()
之后,它从索引中获取“emp”和“date”并将它们移动到列中。

那么为什么要将zflag=2用于员工c,而将1用于员工a?它是基于触发标志的因素,还是在创建标志时,您只是希望每个实例都有一个不同的标志?我只是希望每个实例都有一个不同的标志。您能否解释join
final\u df=pd.merge(df,temp\u df.reset\u index(),how=“left”).fillna(0)
的工作原理?我得到了正确的结果。但我不明白连接是怎么发生的。df和temp_dfI之间并没有公共列,我只是在上面编辑了我的答案,添加了更多细节。