我有一个数据框:
data = {'A': ['p1', 'p2',"p3",'p1', 'p2',"p3",'p1', 'p2',"p4"],
'time': [0,0,0,40,40,40,80,80,80]
}
df = pd.DataFrame (data, columns = ['A','time'])
df.set_index(["time"],inplace=True)
df
输出:
A
time
0 p1
0 p2
0 p3
40 p1
40 p2
40 p3
80 p1
80 p2
80 p4
我想知道A
列在什么时间,什么条目发生更改。
例如,一种缓慢的非矢量化方法将是(您将在时间索引中循环):
t0 = df.loc[40]["A"].unique()
t1 = df.loc[80]["A"].unique()
print("out: ")
print(set(t0).difference(t1))
print("in: ")
print(set(t1).difference(t0))
输出类似:
at t=80:
out:
{'p3'}
in:
{'p4'}
一些收获是:
40
p1
,p2
,p3
可以更改订单有什么想法如何做到更像熊猫吗? 谢谢!
答案 0 :(得分:1)
您可以使用此策略来做一些事情:
df2 = df.groupby(['time'])['A'].unique().reset_index()
time A
0 0 [p1, p2, p3]
1 40 [p1, p2, p3]
2 80 [p1, p2, p4]
现在移动上一行:
df2['B']=df2['A'].shift(1)
time A B
0 0 [p1, p2, p3] NaN
1 40 [p1, p2, p3] [p1, p2, p3]
2 80 [p1, p2, p4] [p1, p2, p3]
现在创建一个函数,以查找/比较差异:
def foo(a,b):
try:
rin = set(a.tolist()).difference(set(b.tolist()))
rout = set(b.tolist()).difference(set(a.tolist()))
return "in: "+str(rin)+" out: "+str(rout)
except:
return ""
并应用它:
df2['diff'] = df2.apply(lambda x: foo(x['A'],x['B']), axis=1)
所需结果:
time A B diff
0 0 [p1, p2, p3] NaN X
1 40 [p1, p2, p3] [p1, p2, p3] in: set() out: set()
2 80 [p1, p2, p4] [p1, p2, p3] in: {'p4'} out: {'p3'}
您现在可以根据需要改进foo函数