Как переупорядочить каждую ячейку для каждой строки в зависимости от ее содержимого?

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

Я пытаюсь реорганизовать фрейм данных.

Сейчас у меня есть фрейм данных (df), где для каждой строки содержимое распределяется по 5 столбцам. Существует 7 вариантов содержимого каждой ячейки: тип_документа, пол, национальность, дата_выдачи, дата_истекания срока действия, страна_выдачи и Нет. Вот пример:

df = pd.DataFrame(
      [["'gender': 'Female'", "'nationality': 'ESP'", "'document_type': 'national_identity_card'", "'date_of_expiry': '2025-11-06'", "'issuing_country': 'ESP'"],
       ["'gender': 'Male'", "'issuing_date': '2015-05'", "'document_type': 'passport'", "'issuing_country': 'FRA'", None],
       ["'document_type': 'national_identity_card'", "'issuing_country': 'GRC'", None, None, None]],
       index=[0,1,2],
       columns=['column1', 'column2', 'column3', 'column4', 'column5'])
In[1]:df
Out[1]: 
                                     column1                    column2                                    column3                         column4                   column5
0                         'gender': 'Female'       'nationality': 'ESP'  'document_type': 'national_identity_card'  'date_of_expiry': '2025-11-06'  'issuing_country': 'ESP'
1                           'gender': 'Male'  'issuing_date': '2015-05'                'document_type': 'passport'        'issuing_country': 'FRA'                      None
2  'document_type': 'national_identity_card'   'issuing_country': 'GRC'                                      None                            None                       None

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

Я создал фреймворк данных (df2) с 6 столбцами (тип_документа, пол, национальность, дата_выдачи, дата_истечения и страна_выдачи), где я хотел бы для каждой строки организовать содержимое в правильную ячейку, т. е. в столбце пола я бы есть «мужской» или «женский» и то же самое для других.

df2 = pd.DataFrame(index=[0,1,2], columns=['document_type', 'gender', 'nationality', 'issuing_date', 'date_of_expiry', 'issuing_country'])
In[2]:df2
Out[2]: df2
     document_type gender nationality issuing_date date_of_expiry issuing_country
0              NaN    NaN         NaN          NaN            NaN             NaN
1              NaN    NaN         NaN          NaN            NaN             NaN
2              NaN    NaN         NaN          NaN            NaN             NaN

Я хотел бы получить что-то вроде этого для df2:

           document_type    gender nationality issuing_date  date_of_expiry issuing_country
0 national_identity_card    Female        ESP          None      2025-11-06             ESP
1               passport      Male       None        2015-05           None             FRA
2 national_identity_card      None       None           None           None             GRC

Контент, который был в определенной строке, должен оставаться в той же строке.

Я подумал об итерации исходного фрейма данных (df), проверяя, содержит ли ячейка для каждой строки и каждого столбца какую-либо строку, содержащуюся в списке (как в lst = ['document_type', 'gender', 'nationality', 'issuing_date', 'date_of_expiry', 'issuing_country']), и, если да, отсортировать ее в правильный столбец.

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

Любая помощь приветствуется. Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это связано с поврежденной структурой данных, поэтому нам нужно сначала исправить проблему, похоже, что это dict для каждой ячейки, поэтому мы используем метод ast

import ast
yourdf=('{'+df.stack()+'}').apply(ast.literal_eval).apply(pd.Series).fillna('').sum(level=0)
yourdf
Out[19]: 
   gender nationality     ...      issuing_country issuing_date
0  Female         ESP     ...                  ESP             
1    Male                 ...                  FRA      2015-05
2                         ...                  GRC             
[3 rows x 6 columns]

Вы можете использовать регулярные выражения:

string_df = df.applymap(str).sum(axis=1)

columns = ['gender', 'nationality', 'document_type', 'date_of_expiry', 'issuing_date', 'issuing_country']
result = [string_df.str.extract(r"'{}': '([\w-]+)'".format(column), expand=False) for column in columns] 

print(pd.concat(result, axis=1).rename(columns = {index: column for index, column in enumerate(columns)}))

Выход:

   gender nationality           document_type date_of_expiry issuing_date  \
0  Female         ESP  national_identity_card     2025-11-06          NaN   
1    Male         NaN                passport            NaN      2015-05   
2     NaN         NaN  national_identity_card            NaN          NaN   

  issuing_country  
0             ESP  
1             FRA  
2             GRC  

Другие вопросы по теме