比较两列数据框中的值

use*_*777 5 python pandas

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

     256   Z
0     2    2
1     2    3
2     4    4
3     4    9
Run Code Online (Sandbox Code Playgroud)

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

cel*_*cel 6

创建数据框:

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

输出继电器:

    256 Z
0   2   2
1   2   3
2   4   4
3   4   9
Run Code Online (Sandbox Code Playgroud)

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

row_ids = df[df["256"] != df.Z].index
Run Code Online (Sandbox Code Playgroud)

Int64Index([1, 3], dtype='int64')
Run Code Online (Sandbox Code Playgroud)


aus*_*acy 5

另一种方法是使用其.loc方法pandas.DataFrame返回限定布尔索引的行的索引位置:

df.loc[(df['256'] != df['Z'])].index
Run Code Online (Sandbox Code Playgroud)

输出:

Int64Index([1, 3], dtype='int64')
Run Code Online (Sandbox Code Playgroud)

这恰好是列出的实现中最快的,如下所示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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

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


Pri*_*mer 0

假设df是你的数据框,这应该可以做到:

df[df['256'] != df['Z']].index
Run Code Online (Sandbox Code Playgroud)

产量:

Int64Index([1, 3], dtype='int64')
Run Code Online (Sandbox Code Playgroud)