Pandas Dataframe 中多列的转换

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

使用Python中的pandas框架,我需要对表中的4列(示例代码中的Col1、Col2、Col3、Col4)应用转换。

转换非常简单:

  • 提取 Unix 时间戳
  • 将 Unix 时间戳转换为日期时间
  • 将日期时间转换为本地时区

下面是我当前的代码,包括转换:

data = [
    {"Col1": "/Date(1591020000000)/", "Col2": "/Date(1591020000000)/", "Col3": "/Date(1591020000000)/", "Col4": "/Date(1591020000000)/", "Col5": 1},
    {"Col1": "/Date(1591020000000)/", "Col2": "/Date(1591020000000)/", "Col3": "/Date(1591020000000)/", "Col4": "/Date(1591020000000)/", "Col5": 2},
    {"Col1": "/Date(1591020000000)/", "Col2": "/Date(1591020000000)/", "Col3": "/Date(1591020000000)/", "Col4": "/Date(1591020000000)/", "Col5": 3},
    {"Col1": "/Date(1591020000000)/", "Col2": "/Date(1591020000000)/", "Col3": "/Date(1591020000000)/", "Col4": "/Date(1591020000000)/", "Col5": 4}
    ]
df = pd.json_normalize(data)
   
 for col in ['Col1', 'Col2', 'Col3', 'Col4']:
       df[col] = df[col].str.extract(r'\(([^\)]+)\)', expand=False)
       df[col] = pd.to_datetime(df[col],unit='ms').dt.tz_localize('UTC').dt.tz_convert('Australia/Sydney').dt.strftime('%d/%m/%Y')

由于我对 Python 和 Pandas 很陌生,我想了解实现此目的的最佳方法是什么

当前的代码似乎并未真正优化,因为我们必须分两步执行转换,每次都迭代所有行。

我在这里看到了很多问题,其中使用了apply方法通过私有函数或lambda内联函数迭代处理列中的数据。

尝试这种方法后,我遇到了很多问题 - 主要与:

  • 数据结果不明确
  • lambda 或私有函数由于 NaN 问题而失败

主要问题:

  1. 如何在多个上处理内联列转换 使用 apply 方法的列(即我们如何使用 apply 方法复制我的代码)

  2. 将转换应用于 Pandas 数据的最优化、最有效的方法是什么

python pandas lambda google-cloud-functions
1个回答
0
投票

代码

有了

apply
,看起来像这样

cols = ['Col1', 'Col2', 'Col3', 'Col4']
pat = r'(\d+)' # you can change pattern

df[cols] = df[cols].apply(
    lambda x: pd.to_datetime(
        x.str.extract(pat, expand=False).astype('float'),
        unit='ms',
        errors='coerce'
    ).dt.tz_localize('UTC')
     .dt.tz_convert('Australia/Sydney')
     .dt.strftime('%d/%m/%Y')
)

df

         Col1        Col2        Col3        Col4  Col5
0  02/06/2020  02/06/2020  02/06/2020  02/06/2020     1
1  02/06/2020  02/06/2020  02/06/2020  02/06/2020     2
2  02/06/2020  02/06/2020  02/06/2020  02/06/2020     3
3  02/06/2020  02/06/2020  02/06/2020  02/06/2020     4
© www.soinside.com 2019 - 2024. All rights reserved.