Обнаружение и удаление нежелательных ячеек в фреймах данных Python pandas

#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 значения. For itemE='strc' , 'strc' неправильно помещается в столбец itemB .

4. @TrentonMcKinney Моя ошибка при вводе примера, но он отлично работает с реальными данными (которые должны оставаться анонимными).

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