如果是字典,如何在循环中解析 pandas 列

问题描述 投票:0回答:2

我有 DataFrame,其中一列包含行中的字典,格式为:

rates
0         {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '0X', 'rate': 73571.98764837519}
1       {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '18C', 'rate': 11607635.869234081}
2     {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1EARTH', 'rate': 4162937.862828232}
3       {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1ECO', 'rate': 7337.697146675354}
4      {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1INCH', 'rate': 34645.31024605586}
...                                                                                               ...
4917     {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'SEK', 'rate': 291937.0479618742}
4918    {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'SGD', 'rate': 41146.239317767526}
4919    {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'THB', 'rate': 1026548.5675256335}
4920    {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'TRY', 'rate': 495117.01581884566}
4921    {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'ZAR', 'rate': 463779.32985313266}

我如何在循环中解析它,以便从中删除字母

T
Z
并将格式更改为
yyyy-mm-dd  hh:mm:ss

我尝试过:

def change_columns_format(self, column_in_df1):
        df = self.getting_response_and_df()
        for i in column_in_df1: 
            for x in i:
                x = [x[:19].replace("T", " ") for x in i]
                print (i)
        return df

但这当然是错误的。

python pandas loops dictionary
2个回答
1
投票

这是如何使用 extract 和 regex 提取时间

模式中的假设是时间将显示为“'time':'2022-06-05T19:25:07.1000000Z'

df['time'] = df['dict'].str.extract(r"(time': ')(.*)(Z)")[1]

使用正则表达式删除 T 和 Z 这是一个例子

df['time'].str.replace(r'[T|Z]',' ', regex=True)

结果

time              2022-06-05 19:25:57.3000000 

df['time'].astype('datetime64')

结果

time             2022-06-05 19:25:57.300

df['time'].astype('datetime64').dt.strftime('%Y-%m-%d %H:%M:%S')

结果

time              2022-06-05 19:25:57

0
投票

您可以使用

pd.json_normalize
rates
列创建数据框,然后修复格式,最后使用
to_dict
重新创建字典:

df['rates'] = (pd.json_normalize(df['rates'])
                 .assign(time=lambda x: x['time'].str[:-1].str.replace('T', ' '))
                 .to_dict('records'))
print(df)

# Output
                                                                                               rates
0         {'time': '2022-06-05 19:25:57.3000000', 'asset_id_quote': '0X', 'rate': 73571.98764837519}
1       {'time': '2022-06-05 19:25:57.3000000', 'asset_id_quote': '18C', 'rate': 11607635.869234081}
2     {'time': '2022-06-05 19:25:57.3000000', 'asset_id_quote': '1EARTH', 'rate': 4162937.862828232}
3       {'time': '2022-06-05 19:25:57.3000000', 'asset_id_quote': '1ECO', 'rate': 7337.697146675354}
4      {'time': '2022-06-05 19:25:57.3000000', 'asset_id_quote': '1INCH', 'rate': 34645.31024605586}
4917     {'time': '2022-06-05 19:25:07.1000000', 'asset_id_quote': 'SEK', 'rate': 291937.0479618742}
4918    {'time': '2022-06-05 19:25:07.1000000', 'asset_id_quote': 'SGD', 'rate': 41146.239317767526}
4919    {'time': '2022-06-05 19:25:07.1000000', 'asset_id_quote': 'THB', 'rate': 1026548.5675256335}
4920    {'time': '2022-06-05 19:25:07.1000000', 'asset_id_quote': 'TRY', 'rate': 495117.01581884566}
4921    {'time': '2022-06-05 19:25:07.1000000', 'asset_id_quote': 'ZAR', 'rate': 463779.32985313266}
© www.soinside.com 2019 - 2024. All rights reserved.