比较两列数据框中的值

时间:2015-01-24 09:45:35

标签: python pandas

我在pandas数据框中有以下两列

     256   Z
0     2    2
1     2    3
2     4    4
3     4    9

大约有1594行。 ' 256'和' Z'是列标题,而0,1,2,3,4是行号(上面第1列)。我想打印行号,其中列号为256' 256'不等于列' Z'中的值。因此,上述情况下的输出将为1,3。 如何在熊猫中进行比较?我将非常感谢你的帮助。感谢。

4 个答案:

答案 0 :(得分:5)

创建数据框:

import pandas as pd
df = pd.DataFrame({"256":[2,2,4,4], "Z": [2,3,4,9]})

输出:

    256 Z
0   2   2
1   2   3
2   4   4
3   4   9

对数据框进行子集化后,使用索引获取子集中行的id:

row_ids = df[df["256"] != df.Z].index

给出

Int64Index([1, 3], dtype='int64')

答案 1 :(得分:5)

另一种方法是使用.loc pandas.DataFrame方法,它返回符合布尔索引的行的索引位置:

df.loc[(df['256'] != df['Z'])].index

输出:

Int64Index([1, 3], dtype='int64')

这恰好是列出的实施中最快的,如ipython notebook中所示:

import pandas as pd
import numpy as np

df = pd.DataFrame({"256":np.random.randint(0,10,1594), "Z": np.random.randint(0,10,1594)})

%timeit df.loc[(df['256'] != df['Z'])].index
%timeit row_ids = df[df["256"] != df.Z].index
%timeit rows = list(df[df['256'] != df.Z].index)
%timeit df[df['256'] != df['Z']].index

输出:

1000 loops, best of 3: 352 µs per loop
1000 loops, best of 3: 358 µs per loop
1000 loops, best of 3: 611 µs per loop
1000 loops, best of 3: 355 µs per loop

然而,当它降至5-10微秒时,它并没有产生显着差异,但如果将来你有一个非常大的数据集时间和效率可能会成为一个更重要的问题。对于1594行的相对较小的数据集,我会选择看起来最优雅的解决方案,并提高可读性。

答案 2 :(得分:2)

你可以试试这个:

# Assuming your DataFrame is named "frame"
rows = list(frame[frame['256'] != frame.Z].index)

rows现在将是一个列表,其中包含这两个列值不相等的行号。所以你的数据是:

>>> frame
   256  Z
0    2  2
1    2  3
2    4  4
3    4  9

[4 rows x 2 columns]
>>> rows = list(frame[frame['256'] != frame.Z].index)
>>> print(rows)
[1, 3]

答案 3 :(得分:0)

假设df是您的数据框,我们应该这样做:

df[df['256'] != df['Z']].index

得到以下特性:

Int64Index([1, 3], dtype='int64')