2015-01-24 2 views
3

У меня есть следующие два столбца в кадре пандсравнение значений в двух столбцах кадра данных

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

данных Есть около 1594 строк. '256' и 'Z' являются заголовками столбцов, тогда как 0,1,2,3,4 являются номерами строк (1-й столбец выше). Я хочу напечатать номера строк, где значение в столбце «256» не равно значениям в столбце «Z». Таким образом, выход в вышеуказанном случае будет равен 1, 3. Как это сравнение можно сделать в пандах? Я буду очень благодарен за помощь. Благодарю.

ответ

0

Предполагая df ваш dataframe, это должно сделать это:

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

получают:

Int64Index([1, 3], dtype='int64') 
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] 
5

Создать фрейм данных:

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

Ouput:

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

После Подменю ваш кадр данных, использовать индекс, чтобы получить идентификатор строки в Подмножество:

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

дает

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

Ваш 'row_ids + 1' из-за« нулевой индексации »на самом деле является вашей попыткой исправить неразрешенную логическую ошибку. У вас есть 'df [df [" 256 "] == df.Z] .index', который находит индексы, где значения столбца равны, и OP хочет их там, где они не равны, поэтому' df [df ["256"] ! = df.Z] .index'. Тогда вам не нужно 'row_ids + 1', если OP не хочет видеть индекс' 0th'. –

+0

@aus_lacy о, я полностью пропустил это - спасибо – cel

+1

Не стоит беспокоиться. Не забудьте изменить свой вывод как подходящий '[1, 3]' как и ожидалось. –

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 строк я бы пошел с решением, которое выглядит наиболее элегантным и способствует наиболее читабельности.

Смежные вопросы