熊猫:比较列

时间:2018-04-09 19:19:09

标签: python-3.x pandas dataframe boolean-logic

嗨我有一个用熊猫制作的数据框。我需要比较两列真值的价值。我做了两个新专栏:" misslast"和" hitlast" " hitlast":当列#34;响应"时,它的值为TRUE值得为真,下一行形成de column" Confidence"是值得的。所有其他组合都应该是假的。 " misslast":当列#34;响应"为False和列中的下一行"置信度"也是假的。 如果下一轮的信心状态与上一轮的表现相符,他们都在比较。

这是mi数据帧(它实际上是[2539行x 19列]矩阵):

      circle_rt    response   circle_number confidence confidence_rt  nose  \
0     12.746130     True              0       True      26.686977  0.000000   
1      5.497027     True              6       True       2.219596  0.120000   
2      3.789324     True              2       True       4.992639  0.118931   
3      7.716839     True              2       True       3.139458  0.067106   
4      4.219006     True              7       True       2.680553  0.000000   
5      6.635735     True              1       True       1.643296  0.015449   
6     12.768281    False              2       True       2.045460  0.000000   
7      4.293818     True              0       True       1.915654  0.060843   
8      2.280957     True              5       True       2.384980  0.000000   

...

32     2.073823     True              4       True       0.614546  0.000000   
33     3.290734    False              7      False       1.675789  0.000000   
34     9.443876    False              6      False       5.116144  0.001011   
35     5.288295     True              8       True       0.642439  0.021680   
36     2.007872     True              0       True       0.948012  0.000000   

例如,比较"响应"中第6行的真值。 "置信度"中的第7行," lashit"应该是正确的,因为他们不平等。 当比较第34行"响应"第34列第34行"置信度"我应该返回True。 这是代码

df['hitlast']=(df['response']&True) & df['confidence'].shift(1).fillna(0)
df['misslast']=(df["response"]&False) & ((df["confidence"]&False).shift(1).fillna(True))#Creo una columna que Indica True Si el valor de "response" es Falso y ademas "Confidence" de la siguiente jugada es False tambien.

我的新数据框增加了两列:Hitlast和misslast

问题是misslast总是假的,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

您的问题是这一行:

(df["response"]&False) & ((df["confidence"]&False).shift(1).fillna(True))

因为它始终会评估为False(任何& False将评估为False

你可以简单地使用:

df['hitlast'] = df['response'] & df['confidence'].shift(-1).fillna(False)

df['misslast'] = ~df['response'] & ~df['confidence'].shift(-1).fillna(True)

行动中:

>>> df
    circle_rt  response  circle_number  confidence  confidence_rt      nose
0   12.746130      True              0        True      26.686977  0.000000
10   3.290734     False              7       False       1.675789  0.000000
11   9.443876     False              6       False       5.116144  0.001011
12   5.288295      True              8        True       0.642439  0.021680
13   2.007872      True              0        True       0.948012  0.000000
>>> df['response'] & df['confidence'].shift(-1).fillna(False)
0     False
10    False
11    False
12     True
13    False
dtype: bool
>>> ~df['response'] & ~df['confidence'].shift(-1).fillna(True)
0     False
10     True
11    False
12    False
13    False
dtype: bool