使用Python中的pandas框架,我需要对表中的4列(示例代码中的Col1、Col2、Col3、Col4)应用转换。
转换非常简单:
下面是我当前的代码,包括转换:
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内联函数迭代处理列中的数据。
尝试这种方法后,我遇到了很多问题 - 主要与:
主要问题:
如何在多个上处理内联列转换 使用 apply 方法的列(即我们如何使用 apply 方法复制我的代码)
将转换应用于 Pandas 数据的最优化、最有效的方法是什么
代码
有了
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