计算列或行之间条件值的出现

时间:2017-08-14 18:03:21

标签: python pandas

我的数据集如下: -

2017-03-01  31.8  28.0     32.6
2017-04-01  31.6  28.0     32.6
2017-05-01  31.0  27.0     32.6
2017-06-01  31.0  27.0     32.4
2017-07-01  31.0  27.0     31.4
2017-08-01  30.0  27.0     32.6

除第一列外,其余列均为温度。我想要做的是比较第4列(从右边起)与其他列值的值,以找出温度值是否不大于或小于2度(第4列)。例如,我想计算所有三列(行方式)的值在30.6到34.6之间的次数。

pandas下是否有可用的功能?

4 个答案:

答案 0 :(得分:2)

根据您的示例数据,您可以尝试:

df2[['t1','t2','t3']].apply(lambda x : abs(x-df2['t3'])<2).sum(axis=1)==3

Out[425]: 
0    False
1    False
2    False
3    False
4    False
5    False
dtype: bool

数据输入

    df2
    Out[426]: 
             Time    t1  t2    t3
    0  2017-03-01  31.8  28  32.6
    1  2017-04-01  31.6  28  32.6
    2  2017-05-01  31.0  27  32.6
    3  2017-06-01  31.0  27  32.4
    4  2017-07-01  31.0  27  31.4
    5  2017-08-01  30.0  27  32.6

答案 1 :(得分:2)

a b的值小于c

的列数

In [726]: (df[['a', 'b']].sub(df['c'], axis=0).abs() < 2).all(1).sum()
Out[726]: 0

In [727]: (df[['a', 'b']].sub(df['c'], axis=0).abs() < 2)
Out[727]:
       a      b
0   True  False
1   True  False
2   True  False
3   True  False
4   True  False
5  False  False

值介于30.6至34.6之间

In [671]: (df[['a', 'b', 'c']] > 30.6) & (df[['a', 'b', 'c']] < 34.6)
Out[671]:
       a      b     c
0   True  False  True
1   True  False  True
2   True  False  True
3   True  False  True
4   True  False  True
5  False  False  True

30.6到34.6之间的值,对于一行中的所有列都是True

In [672]: ((df[['a', 'b', 'c']] > 30.6) & (df[['a', 'b', 'c']] < 34.6)).all(1)
Out[672]:
0    False
1    False
2    False
3    False
4    False
5    False
dtype: bool

所有列的值在30.6到34.6之间的行数

In [673]: ((df[['a', 'b', 'c']] > 30.6) & (df[['a', 'b', 'c']] < 34.6)).all(1).sum()
Out[673]: 0

答案 2 :(得分:2)

如果我正确理解了您的问题,您想知道所有值的次数是否在第四列的范围±2之内(列的编号为0,1,2,3):

(((df[3] - df[1]).abs() < 2) & ((df[3] - df[2]).abs() < 2)).sum()
#0

答案 3 :(得分:1)

您可以使用dataframe.apply对每行执行比较,并对比较结果求和。

import pandas

df = pandas.DataFrame(
    data=[
        [31.8,  28.0,     32.6],
        [31.6,  28.0,     32.6],
        [31.0,  27.0,     32.6],
        [31.0,  27.0,     32.4],
        [31.0,  27.0,     31.4],
        [30.0,  27.0,     32.6]
    ],
    index=['2017-03-01', '2017-04-01', '2017-05-01', '2017-06-01', '2017-07-01', '2017-08-01']
)

df['count'] = df.apply(lambda x: sum((x > 30.6) & (x < 34.6)), axis=1)
print(df)

True == 1False == 0开始,您将获得符合条件的列数