Как мне создать фрейм данных Pandas, в котором набор столбцов отличается для каждой строки?

#python #pandas #dataframe

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

Вопрос:

По сути, я хочу что-то вроде этого:

     A   B   C   D
1   v   v       v
2   v       v   v
3       v   v
  

где:

  • строка 1 имеет значение для столбцов A, B и D, но не имеет столбца C
  • строка 2 имеет значение для столбцов A, C и D, но не имеет столбца B
  • строка 3 имеет значение для столбцов B и C, но не содержит столбцов A и D.

В качестве небольшой предыстории я извлекаю строки из Dynamo DB непосредственно в фрейм данных Pandas, и поскольку каждая строка в Dynamo по сути является отдельным автономным объектом JSON, я часто сталкиваюсь с описанной выше ситуацией. Некоторые из моих вызовов функций pandas завершаются ошибкой KeyError, поскольку столбец даже не существует. Я хочу воссоздать ситуацию, чтобы найти способ справиться с ней более изящно.

Спасибо.

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

1. Вы пробовали .loc ? Что-то вроде df.loc[0, ['A', 'B', 'D']] = ['v', 'v', 'v'] .

2. Можете ли вы загрузить данные в фрейм данных? Не могли бы вы показать, как выглядят ваши входные данные и ожидаемый результат?

3. @ResidentSleeper — У меня есть — когда я это делаю, я получаю — KeyError: «Ни один из [Index([‘A’, ‘B’, ‘D’], dtype=’object’)] не находится в [столбцах]»

4. @FrancoPiccolo — Не так просто — мы имеем дело с данными наблюдения, и они генерируют ~ 50 строк в секунду. По сути, JSON на уровне строки содержит данные наблюдения, которые были измерены в этом интервале. Многие столбцы являются общими для каждой строки, но не для каждого столбца. В качестве примера столбец activity отображается 3 раза в 550 строках данных наблюдения.

5. Сначала вы должны создать фрейм данных. df = pd.DataFrame(columns=['A', 'B', 'C', 'D']) Затем попробуйте df.loc[0, ['A', 'B', 'D']] = ['v', 'v', 'v'] .

Ответ №1:

Например, если вы ищете все уникальные перестановки списка ['v', 'v', 'v', ''] , это можно сделать с помощью itertools :

 import itertools

data_list = ['v', 'v', 'v', '']
data = set(itertools.permutations(data_list))
df = pd.DataFrame(data=data, columns=list('ABCD'))
  

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

1. Я не думаю, что у него есть только v его данные. Они были скорее символическими в отношении того, где у него есть данные, а где нет.

2. @Quang Hoang — Это на 100% правильно. Я использовал v, чтобы указать, что существует значение, но значение не было важным для контекста вопроса.

Ответ №2:

Это генерирует фрейм данных, но в 1-й строке есть столбец ‘C’, во 2-й строке есть столбец ‘D’, а в 3-й строке есть столбцы ‘A’ и ‘D’, несмотря на то, что я их не указываю:

 df = pd.DataFrame([{'A': 'v', 'B': 'v', 'D': 'v'}, {'A':'v', 'B':'v', 'C':'v'}, {'B':'v', 'C':'v'}])
  

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