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

时间:2019-04-07 03:28:13

标签: python pandas

这是我的第一个问题,对于任何格式错误或解释错误,我深表歉意。

我正在尝试重组数据框。

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

感谢您的帮助。谢谢。

2 个答案:

答案 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