如何根据每一行的内容重新排列每一个单元格?

2024-05-21 00:13:11 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这里的第一个问题,所以我为任何格式错误或错误的解释道歉

我正在尝试重新组织一个数据帧

现在我有一个dataframe(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还很陌生,不知道该怎么做。我一直在尝试的都无法解决这个问题

感谢您的帮助。谢谢你


Tags: ofnonedatetypenancardgenderdocument
2条回答

您可以使用正则表达式:

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  

这是由于一个损坏的数据结构,所以我们需要首先解决这个问题,看起来每个单元格都有一个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]

相关问题 更多 >