查找大熊猫数据框的列发生变化的索引

时间:2020-02-07 22:21:04

标签: python pandas dataframe

我有一个数据框:

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
  • p1p2p3可以更改订单

有什么想法如何做到更像熊猫吗? 谢谢!

1 个答案:

答案 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函数