#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Мой фрейм данных является вложенным, так как в значениях ячеек нескольких столбцов сами фреймы данных состоят из 1 строки. Каждый фрейм данных внутри фрейма данных должен иметь либо 3 столбца, либо 5 столбцов, например:
ColumnA ColumnB
'abc','def','ghi' 123,456,789,012,345
'zyx','wvu','tsr' 987,654,321,098,765
(Данные получены из внешнего источника, поэтому я не могу их контролировать.) Как только я получаю данные, я расширяю все это в не вложенные фреймы данных и объединяю их:
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
abc def ghi 123 456 789 012 345
zyx wvu tsr 987 654 321 098 765
Недавно мне был отправлен 1-строчный фрейм данных внутри фрейма данных, который должен был содержать 3 столбца, но на самом деле имел 4. По сути, мой объединенный фрейм данных теперь имеет одну дополнительную ячейку; это отбрасывает весь объединенный фрейм данных, поскольку все, что находится ниже и справа от этой дополнительной ячейки, теперь заполнено значениями, которые должны быть в другом столбце. Например:
Col1 Col2 XColX Col3 Col4 Col5 Col6 Col7 Col8
abc def XXXXX ghi 123 456 768 012 345
zyx wvu tsr 987 654 321 098 765 NaN
Я не хочу просто избавиться от этой лишней ячейки в этот раз; Я хочу убедиться, что это больше не повторится! Другими словами, я не хочу обнаруживать и удалять неправильный шаблон, который действительно произошел; Я хочу диктовать и применять правильный шаблон, который должен произойти.
Используя pandas / python / regex / numpy / что угодно, как мне убедиться, что этим 1-строчным фреймам данных внутри фреймов данных разрешено содержать только столбцы из предварительно утвержденного списка имен столбцов?
ETA: По запросу, вот код, используемый для расширения данных в не вложенные фреймы:
ColumnA_vals = df['ColumnA'].str.extractall(r'([wd] )=([^,)]*)')
ColumnA_converted = ColumnA_vals.unstack(level=-1)[1]
ColumnA_converted.columns = list(ColumnA_vals.unstack(level=-1)[0].values[0])
colnames = ColumnA_converted.columns
ColumnA_converted.columns = [x for x in colnames]
df2 = df.drop(['ColumnA'], axis=1)
df = pd.concat([ColumnA_converted, df2], axis=1)
# lather-rinse-repeat for each of the original un-prettied columns provided
Это будет иметь больше смысла, если вы знаете, что фактические 1-строчные фреймы данных внутри фреймов данных выглядят следующим образом:
IdA(Col1='abc',Col2='def',Col3='ghi')
Комментарии:
1. Вы можете проверить длину элементов в каждом столбце. Что вы хотите, чтобы произошло, если, например, в ваших ячейках первого столбца 4 элемента вместо ожидаемых 3?
2. Я хочу удалить элемент с неправильным именем столбца
3.
list(ColumnA_vals.unstack(level=-1)[0].values[0])
извлекает все правильныеitemX
значения. ForitemE='strc'
,'strc'
неправильно помещается в столбецitemB
.4. @TrentonMcKinney Моя ошибка при вводе примера, но он отлично работает с реальными данными (которые должны оставаться анонимными).
5. Стоит упомянуть, что я нашел решение для этой конкретной проблемы, которое полностью позволило избежать проблемы, но я все еще хочу знать, как решить эту конкретную проблему.