这是我的第一个问题,对于任何格式错误或解释错误,我深表歉意。
我正在尝试重组数据框。
现在我有一个数据框(df),其中每一行的内容通过其5列进行分配。每个单元格的内容有7种可能:document_type,性别,国籍,issuing_date,expiry_date_of,expiring_country和None。这是一个示例:
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列(document_type,性别,国籍,issuing_date,date_of_expiry和issuing_country),我希望将每一行的内容组织到正确的单元格中,即性别专栏,我会说“男”或“女”,其他人都一样。
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还是很陌生,不知道该怎么做。我一直在尝试什至无法解决这个问题。
感谢您的帮助。谢谢。
答案 0 :(得分:0)
这是由于数据结构损坏导致的,因此我们需要首先解决该问题,看起来每个单元格都是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]
答案 1 :(得分:0)
您可以使用正则表达式:
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