Это мой первый вопрос здесь, поэтому я прошу прощения за любые ошибки форматирования или плохое объяснение.
Я пытаюсь реорганизовать фрейм данных.
Сейчас у меня есть фрейм данных (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 и не знаю, как это сделать. То, что я пробовал, даже близко не подходит для решения этой проблемы.
Любая помощь приветствуется. Спасибо.
Это связано с поврежденной структурой данных, поэтому нам нужно сначала исправить проблему, похоже, что это 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