根据条件比较列值

时间:2017-08-07 17:22:48

标签: python pandas conditional-statements multiple-columns difference

我有一个txt文件的以下输出。我的目标是找到第2列和第3列的值之间的差异,只要第1列中的值保持低于或等于5,这意味着我的预期输出是第2行和第3行之间的差异,直到第5行为第6行中的第1列值大于5.

  1. 1 4 5
  2. 2 6 7
  3. 3 8 8
  4. 4 4 7
  5. 5 3 2
  6. 6 8 4
  7. 我尝试了以下方法。

    import pandas as pd
    data= pd.read_table('/Users/Hrihaan/Desktop/A.txt', dtype=float, header=None, sep='\s+').values
    x=data[:,0]
    y=(data[:,1] for x<=5)
    z=(data[:,2] for x<=5)
    Diff=y-z
    print(Diff)
    

    我收到了这个错误:(语法错误:语法无效),任何有关如何实现它的帮助都会非常有帮助。

4 个答案:

答案 0 :(得分:3)

import numpy as np

>>> np.where(data[:, 0] <= 5, data[:, 1] - data[:, 2], np.nan)
array([ -1.,  -1.,   0.,  -3.,  1.,  nan])

对于您的代码,您可以使用条件列表理解:

y = [i for x, i in zip(data[:, 0], data[:, 1]) if x <= 5]
z = [i for x, i in zip(data[:, 0], data[:, 2]) if x <= 5]
diff = [a - b for a, b in zip(y, z)]

...或

diff = [y - z for x, y, z in data if x <= 5]

答案 1 :(得分:2)

或者你可以试试这个

(df2['v2'].subtract(df2['v3']))[(df2['v1']<=5)]

Out[856]: 
0   -1
1   -1
2    0
3   -3
4    1
dtype: int64

数据输入

  df2
    Out[857]: 
       v1  v2  v3
    0   1   4   5
    1   2   6   7
    2   3   8   8
    3   4   4   7
    4   5   3   2
    5   6   8   4

答案 2 :(得分:2)

假设您的列名称为'a''b''c'。只需用您自己的

交换列名

选项1

df.query('a <= 5').eval('b - c')

选项2

df.b.sub(df.c)[df.a.le(5)]

答案 3 :(得分:1)

我认为SyntaxError来自你的生成器理解,因为它并没有真正做任何事情。什么是迭代?

无论如何,您可以直接选择列为<= 5的行,如下所示:

编辑:您不需要将DataFrame转换为.values的numpy数组。

 import pandas as pd
 data = pd.read_table('/Users/Hrihaan/Desktop/A.txt', dtype=float, header=None, sep='\s+') # note: no .values
 idx = data[0] <= 5
 Diff = data.loc[idx, 1] - data.loc[idx, 2]
 print(Diff)