panda更新dict列值



我有如下的df,其中"Fee_detail"列值是dict。我需要从;Fee_detail"列并在"中更新;Fee_info"默认情况下具有空dict的列。

d = {'Fee_detail': [{'date':'datetime.datetime(2022, 5, 5, 7, 31)', 'Fees':1200, 'penalty':0}, {'date':'datetime.datetime(2022, 5, 7, 7, 31)', 'Fees':1000, 'penalty':10}, {'date':'datetime.datetime(2022, 5, 11, 7, 31)', 'Fees':800,'penalty':50}], 'Name': ["Adam", "Laura","Andrew"], 'Fee_info':[{},{},{}]}
df = pd.DataFrame(data=d)

df:

Fee_detail名称Fee_info
{‘date':‘datetime.datetime(2022,5,5,7,31(’,‘费用’:1200,‘罚款’:0}"亚当{}
{'date':'datetime.datetime(2022,5,7,7,31(','费用':1000,'罚款':10}"劳拉{}
{'date':'datetime.datetime(2022,5,11,7,31(','费用':800,'罚款':50}"Andrew">{}

不幸的是,由于输入类型不正确,您必须循环并评估您的字符串:

from ast import literal_eval
from datetime import datetime
df['Fee_info'] = [{'date': datetime(*literal_eval(d['date'][17:]))
.strftime('%d-%m-%Y'),
'penalty': d['penalty']}
for d in df['Fee_detail']]

输出:

Fee_detail    Name                               Fee_info
0   {'date': 'datetime.datetime(2022, 5, 5, 7, 31)', 'Fees': 1200, 'penalty': 0}    Adam   {'date': '05-05-2022', 'penalty': 0}
1  {'date': 'datetime.datetime(2022, 5, 7, 7, 31)', 'Fees': 1000, 'penalty': 10}   Laura  {'date': '07-05-2022', 'penalty': 10}
2  {'date': 'datetime.datetime(2022, 5, 11, 7, 31)', 'Fees': 800, 'penalty': 50}  Andrew  {'date': '11-05-2022', 'penalty': 50}

对mozway解决方案稍作修改,也可以使用:

import pandas as pd
df['Fee_info'] = [{'date': eval(re.sub(r'datetime.', '', df.Fee_detail[i]['date'])).strftime('%Y-%m-%d'),
'fee_info' : df.Fee_detail[i]['penalty']} 
for i in range(0, len(df.index))
]

输出:

Fee_detail  ...                                Fee_info
0  {'date': 'datetime.datetime(2022, 5, 5, 7, 31)...  ...   {'date': '2022-05-05', 'fee_info': 0}
1  {'date': 'datetime.datetime(2022, 5, 7, 7, 31)...  ...  {'date': '2022-05-07', 'fee_info': 10}
2  {'date': 'datetime.datetime(2022, 5, 11, 7, 31...  ...  {'date': '2022-05-11', 'fee_info': 50}

最新更新