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')]