Сравнение строк фрейма данных pandas

#python #pandas #dataframe #data-wrangling

#python #pandas #фрейм данных #перебор данных

Вопрос:

У меня есть фрейм данных, подобный:

df = pd.DataFrame({30: {'2020-10-09': 12.79, '2020-10-12': 12.83, '2020-10-13': 12.88, '2020-10-14': 12.93, '2020-10-15': 12.99, '2020-10-16': 13.07, '2020-10-19': 13.16, '2020-10-20': 13.24, '2020-10-21': 13.32, '2020-10-22': 13.42}, 365: {'2020-10-09': 12.27, '2020-10-12': 12.27, '2020-10-13': 12.28, '2020-10-14': 12.29, '2020-10-15': 12.29, '2020-10-16': 13.07, '2020-10-19': 12.31, '2020-10-20': 12.32, '2020-10-21': 12.32, '2020-10-22': 12.33}})

Я хочу найти строки, в которых значения равны во всех столбцах. Я могу сделать это с .loc помощью, но это означало бы, что мне придется жестко кодировать имена столбцов, чего я не хочу делать, поскольку возможно, у меня будет больше столбцов для сравнения в будущем. Я довольно близок к

df.eq(df.iloc[:, 0], axis=0)

Что дает

              30     365
2020-10-09  True    False
2020-10-12  True    False
2020-10-13  True    False
2020-10-14  True    False
2020-10-15  True    False
2020-10-16  True    True
2020-10-19  True    False
2020-10-20  True    False
2020-10-21  True    False
2020-10-22  True    False
  

но я не могу получить строки с True в каждом столбце. Я думал, что использование df[df.eq(df.iloc[:, 0], axis=0)] должно работать, но оно выдает ошибку с несколькими индексами. Спасибо!

Ответ №1:

Вы можете добавить DataFrame.all для проверки, если все True и использовать boolean indexing :

 df = df[df.eq(df.iloc[:, 0], axis=0).all(axis=1)]
print (df)
              30     365
2020-10-16  13.07  13.07
  

Комментарии:

1. Потрясающе. Спасибо, я не забуду .all проверить логические значения.