Python 熊猫广播

Python 熊猫广播,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有下表: Time A B (A & B) (A | B) t1 t2 1Mon T T T T 1Mon 1Tue T F F T 1Wed F T F T 1Thu F F F F 1Thu 1Fri T T T

我有下表:

Time    A    B    (A & B)   (A | B)    t1     t2
1Mon    T    T       T         T      1Mon  
1Tue    T    F       F         T
1Wed    F    T       F         T
1Thu    F    F       F         F             1Thu
1Fri    T    T       T         T      1Fri   
1Sat    T    T       T         T      1Sat
1Sun    F    F       F         F             1Sun
2Mon    F    F       F         F             2Mon
条件如下:

df['t1'] = df['Time'][df['(A & B)' == 'T']
df['t2'] = df['Time'][df['(A | B)' == 'F']
是否有一种方法可以使用广播/矢量化提取一对T1、T2,以便:

T1是t2之后最早的T1实例 T2是t1之后T2的最早实例 在上表中,将返回1Mon、1Thu和1Fri、1Sun

我知道逻辑有点递归,可以通过循环数据帧来实现。我只是想弄清楚,通过改变专栏,是否也能实现一些神奇的效果


编辑了一些错误

我不确定此解决方案的通用性,但由于t1和t2列始终是不同的,即A和B!=~A | B对于A和B的任何值,可以执行如下操作:

从数据帧开始:

df

   Time  A  B (A & B) (A | B)    t1    t2
0  1Mon  T  T       T       T  1Mon   NaN
1  1Tue  T  F       F       T   NaN   NaN
2  1Wed  F  T       F       T   NaN   NaN
3  1Thu  F  F       F       F   NaN  1Thu
4  1Fri  T  T       T       T  1Fri   NaN
5  1Sat  T  T       T       T  1Sat   NaN
6  1Sun  F  F       F       F   NaN  1Sun
7  2Mon  F  F       F       F   NaN  2Mon
提取相关列:

df2 = df[['t1', 't2']]
删除具有所有NaN值的行:

查找t1中直接跟随非空行的行我们不想保留这些行,因为它们永远不会是t2之后t1的最早实例:

对于t2,找到相同的值:

现在仅从df2中获取有用的行:

df2 = df2[~useless_t1s & ~useless_t2s]
我们现在有一个表,其中只包含包含您感兴趣的单元格的行:

df2

     t1    t2
0  1Mon   NaN
3   NaN  1Thu
4  1Fri   NaN
6   NaN  1Sun
删除每列的空行,并将结果压缩在一起以获得结果:

result = zip(df2.t1.dropna(), df2.t2.dropna())

result

[('1Mon', '1Thu'), ('1Fri', '1Sun')]

是不是应该是1Mon,1Thu和1Fri,1Sun,因为1Sun出现在2Mon之前,并且是t2列中在1Fri之后出现的第一个元素?另外,t1和t2列中的条件与表中显示的不一致。你是对的@bunji,我的错。现在编辑成正确的格式:哇,这是一个有点难让我的头围绕@bunji。让我试试:@Yeile让我知道你发现哪些部分很棘手,我很乐意添加更详细的解释。
df2 = df2[~useless_t1s & ~useless_t2s]
df2

     t1    t2
0  1Mon   NaN
3   NaN  1Thu
4  1Fri   NaN
6   NaN  1Sun
result = zip(df2.t1.dropna(), df2.t2.dropna())

result

[('1Mon', '1Thu'), ('1Fri', '1Sun')]