我在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。 如何在熊猫中进行比较?我将非常感谢你的帮助。感谢。
答案 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')