从旧Datafram单元格中的字典创建新DataFrame

2024-09-30 14:38:04 发布

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

我有这样一个数据帧:

print(df_master)

Authors              | Codes | ID     | Year
[{first_name: 'fn1', | 11111 | id0001 | 2019
  last_name: 'ln1'}, 
 {first_name: 'fn2', 
  last_name: 'ln2'}]
[{first_name: 'fn3', | 22222 | id0002 | 2019
  last_name: 'ln3'}]

我想从Authors列创建一个新的Dataframe,如下所示:

print(df_authors)

First Name | Last Name | Codes | ID     | Year
'fn1'      | 'ln1'     | 11111 | id0001 | 2019
'fn2'      | 'ln2'     | 11111 | id0001 | 2019
'fn3'      | 'ln3'     | 22222 | id0002 | 2020

现在我连字典都查不到。我试过:

df_dim['Authors'].apply(pd.Series)

但我得到了同样的专栏。 *我认为问题是dict存储为string


Tags: nameiddfyearauthorscodesfirstlast
2条回答
# Return first_names and last_names
def get_first_last_names(authors):
    first_names = []
    last_names = []
    for a in authors:
            first_names.append(a['first_name'])
            last_names.append(a['last_name'])
    return first_names, last_names

first_names, last_names = get_first_last_names(df['Authors'].values)
# Add new columns and set values
df['first_name'] = first_names
df['last_name'] = last_names
# Drop Authors column
df.drop(columns=['Authors'], axis=1, inplace=True)

使用ast.literal_eval在列表理解中创建新字典,用于将字符串repr转换为字典和join转换为原始数据帧:

import ast

df1 = (pd.DataFrame([{**y, **{'i':k}} 
                     for k, v in df.pop('Authors').items() 
                     for y in ast.literal_eval(v)]).set_index('i'))

print (df1)
  first_name last_name
i                     
0        fn1       ln1
0        fn2       ln2
1        fn3       ln3

df = df.join(df1).reset_index(drop=True)
print (df)
   Codes      ID  Year first_name last_name
0  11111  id0001  2019        fn1       ln1
1  11111  id0001  2019        fn2       ln2
2  22222  id0002  2019        fn3       ln3

相关问题 更多 >