Каков самый простой способ удалить повторяющиеся столбцы из фрейма данных?
Я читаю текстовый файл с повторяющимися столбцами через:
import pandas as pd
df=pd.read_table(fname)
Имена столбцов:
Time, Time Relative, N2, Time, Time Relative, H2, etc...
Все столбцы Time и Time Relative содержат одни и те же данные. Я хочу:
Time, Time Relative, N2, H2
Все мои попытки сбросить, удалить и т. Д., Например:
df=df.T.drop_duplicates().T
Привести к однозначным ошибкам индекса:
Reindexing only valid with uniquely valued index objects
Извините за то, что я новичок Панды. Мы ценим любые предложения.
дополнительные детали
Версия Pandas: 0.9.0
Версия Python: 2.7.3
Windows 7
(устанавливается через Pythonxy 2.7.3.0)
файл данных (примечание: в реальном файле столбцы разделены табуляцией, здесь они разделены 4 пробелами):
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
import pandas as pd; pd.__version__
)read_table
для примера, который я составил.Ответы:
Есть однострочное решение проблемы. Это применимо, если некоторые имена столбцов дублируются, и вы хотите их удалить:
Как это устроено:
Предположим, что столбцы фрейма данных
['alpha','beta','alpha']
df.columns.duplicated()
возвращает логический массив:True
илиFalse
для каждого столбца. Если это так,False
то имя столбца уникально до этого момента, если это так,True
то имя столбца дублируется ранее. Например, используя данный пример, возвращаемое значение будет[False,False,True]
.Pandas
позволяет индексировать с использованием логических значений, в результате чего выбираются толькоTrue
значения. Поскольку мы хотим сохранить недублированные столбцы, нам нужно перевернуть приведенный выше логический массив (т.е.[True, True, False] = ~[False,False,True]
)Наконец,
df.loc[:,[True,True,False]]
выбирает только недублируемые столбцы с помощью вышеупомянутой возможности индексирования.Примечание : приведенное выше проверяет только имена столбцов, но не значения столбцов.
источник
df.T.drop_duplicates().T
.Похоже, вы уже знаете уникальные имена столбцов. Если это так, то
df = df['Time', 'Time Relative', 'N2']
сработает.Если нет, ваше решение должно работать:
Вероятно, у вас есть что-то конкретное в ваших данных, что портит их. Мы могли бы оказать дополнительную помощь, если бы вы могли предоставить нам более подробную информацию о данных.
Изменить: Как сказал Энди, проблема, вероятно, связана с повторяющимися заголовками столбцов.
Для примера файла таблицы dummy.csv я составил:
использование
read_table
дает уникальные столбцы и работает правильно:Если ваша версия не позволяет вам, вы можете придумать решение, чтобы сделать их уникальными:
источник
df['Time']
выбирает все временные ряды (т.е. возвращает DataFrame), иdf['Time', ..]
это возвращает весь DataFrame.RecursionError: maximum recursion depth exceeded
Транспонирование неэффективно для больших фреймов данных. Вот альтернатива:
Используйте это так:
редактировать
Версия с эффективным использованием памяти, которая обрабатывает nans как любое другое значение:
источник
my_df.T.drop_duplicates().T
бы на больших фреймах данных./usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: 'pandas.core.common.array_equivalent' is deprecated and is no longer public API
if array_equivalent(ia, ja):
на,if np.array_equal(ia, ja):
кажется, дает те же результаты, но я читал, что она плохо обрабатывает NaN.array_equivalent
публичного репо, возможно, в более старой ветке?numpy.array_equiv
; для панд, я не вижу веток более раннихpandas.core.common
Если я не ошибаюсь, следующее выполняет то, что было запрошено, без проблем с памятью решения транспонирования и с меньшим количеством строк, чем функция @kalu, сохраняя первый из любых столбцов с одинаковыми именами.
источник
Похоже, вы были на правильном пути. Вот та строчка, которую вы искали:
Но поскольку нет примера фрейма данных, который генерирует указанное сообщение об ошибке
Reindexing only valid with uniquely valued index objects
, трудно сказать, что именно решило бы проблему. если для вас важно восстановление исходного индекса, сделайте следующее:источник
Первый шаг: - Прочтите первую строку, т.е. все столбцы, удалите все повторяющиеся столбцы.
Второй шаг: - Наконец прочтите только эти столбцы.
источник
Я столкнулся с этой проблемой, когда один лайнер, предоставленный первым ответом, работал хорошо. Однако у меня возникла дополнительная сложность, когда во второй копии столбца были все данные. Первый экземпляр не стал.
Решение заключалось в том, чтобы создать два фрейма данных, разделив один фрейм данных путем переключения оператора отрицания. Получив два фрейма данных, я запустил оператор соединения, используя расширение
lsuffix
. Таким образом, я мог бы ссылаться на столбец без данных и удалить его.- E
источник
Приведенный ниже способ идентифицирует дублирующиеся столбцы, чтобы проверить, что происходит не так при первоначальном построении фрейма данных.
источник
Быстрый и простой способ удалить повторяющиеся столбцы по их значениям:
df = df.T.drop_duplicates (). T
Дополнительная информация: руководство Pandas DataFrame drop_duplicates .
источник