我有如下的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}