目前,我已经通过使用带有lambda函数的.Apply()获得了标题:

calFilteredDf['startTime'] = calFilteredDf['start'].apply(lambda x: x['dateTime'])

这是非常慢的,我想知道如何才能在更短的时间内达到同样的结果.CalFilteredDf[‘Start’]是一个Pandas 系列,来自‘Start’列的数据如下所示:

1       {'date': None, 'dateTime': '2021-08-11T15:00:0...
2       {'date': None, 'dateTime': '2021-08-12T09:30:0...
3       {'date': None, 'dateTime': '2021-08-12T10:00:0...
4       {'date': None, 'dateTime': '2021-08-18T11:00:0...
                              ...                        
1692    {'date': None, 'dateTime': '2023-08-09T14:00:0...
1693    {'date': None, 'dateTime': '2023-08-09T15:00:0...
1694    {'date': None, 'dateTime': '2023-08-10T11:30:0...
1695    {'date': None, 'dateTime': '2023-08-10T16:00:0...
1696    {'date': None, 'dateTime': '2023-08-10T17:00:0...
Name: start, Length: 1697, dtype: object

新的‘startTime’列中的数据需要如下所示:

1       2021-08-11T15:00:00-04:00
2       2021-08-12T09:30:00-04:00
3       2021-08-12T10:00:00-04:00
4       2021-08-18T11:00:00-04:00
                  ...            
1692    2023-08-09T14:00:00-04:00
1693    2023-08-09T15:00:00-04:00
1694    2023-08-10T11:30:00-04:00
1695    2023-08-10T16:00:00-04:00
1696    2023-08-10T17:00:00-04:00
Name: startTime, Length: 1697, dtype: object

有没有办法快速完成这项工作?我试着让

calFilteredDf['startTime'] = calFilteredDf['startTime']['dateTime']

我还try 使用.loc,但没有成功,因为‘Start’的行不是正确的数据类型,并且我try 使用较快的库来并行化.Apply()正在执行的进程,但由于数据集不是很大,它实际上会使速度变慢,因为库需要执行额外的步骤来确定处理数据的最佳方式.

推荐答案

Pd.json_Normize使用起来更方便,但它被证明是最慢的.列表生成器已经成为所有生成器中速度最快的.下面是pd.json_Normize代码.并使用不同的方法进行测试.

import pandas as pd

aaa = [[{'date': None, 'dateTime': '2021-08-12T09:30'}],
[{'date': None, 'dateTime': '2021-08-12T10:00'}],
[{'date': None, 'dateTime': '2021-08-18T11:00'}],
[{'date': None, 'dateTime': '2023-08-09T14:00'}],
[{'date': None, 'dateTime': '2023-08-09T15:00'}],
[{'date': None, 'dateTime': '2023-08-10T11:30'}],
[{'date': None, 'dateTime': '2023-08-10T16:00'}],
[{'date': None, 'dateTime': '2023-08-10T17:00'}]]


calFilteredDf = pd.DataFrame(aaa)

print(calFilteredDf)

calFilteredDf = pd.json_normalize(calFilteredDf[0])
calFilteredDf['startTime'] = calFilteredDf['dateTime']

print(calFilteredDf)

输入

                                                0
0  {'date': None, 'dateTime': '2021-08-12T09:30'}
1  {'date': None, 'dateTime': '2021-08-12T10:00'}
2  {'date': None, 'dateTime': '2021-08-18T11:00'}
3  {'date': None, 'dateTime': '2023-08-09T14:00'}
4  {'date': None, 'dateTime': '2023-08-09T15:00'}
5  {'date': None, 'dateTime': '2023-08-10T11:30'}
6  {'date': None, 'dateTime': '2023-08-10T16:00'}
7  {'date': None, 'dateTime': '2023-08-10T17:00'}

输出

   date          dateTime         startTime
0  None  2021-08-12T09:30  2021-08-12T09:30
1  None  2021-08-12T10:00  2021-08-12T10:00
2  None  2021-08-18T11:00  2021-08-18T11:00
3  None  2023-08-09T14:00  2023-08-09T14:00
4  None  2023-08-09T15:00  2023-08-09T15:00
5  None  2023-08-10T11:30  2023-08-10T11:30
6  None  2023-08-10T16:00  2023-08-10T16:00
7  None  2023-08-10T17:00  2023-08-10T17:00

是的,的确,json_Normizize的速度是原来的两倍.下面是使用Apply、json_Normize、Transform、List Generator的代码.

now = datetime.datetime.now()
for i in range(10000):
    calFilteredDf[0].apply(lambda x: x['dateTime'])

time_ = datetime.datetime.now() - now
print('apply', time_)

now = datetime.datetime.now()
for i in range(10000):
    pd.json_normalize(calFilteredDf[0])

time_ = datetime.datetime.now() - now
print('json_normalize', time_)


now = datetime.datetime.now()
for i in range(10000):
    calFilteredDf[0].transform(lambda x: x['dateTime'])

time_ = datetime.datetime.now() - now
print('transform', time_)

now = datetime.datetime.now()
for i in range(10000):
    a = [i['dateTime'] for i in calFilteredDf[0]]

time_ = datetime.datetime.now() - now
print('list generator', time_)

输出

apply 0:00:01.707580
json_normalize 0:00:03.666553
transform 0:00:01.896933
list generator 0:00:00.056657

输出结果是使用列表生成器.

Python相关问答推荐

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

如何将Pydantic URL验证限制为特定主机或网站

在Python中使用readline函数时如何向下行

根据多列和一些条件创建新列

如何对行使用分段/部分.diff()或.pct_change()?

在Python中,什么表达相当于0x1.0p-53?

如何才能将每个组比上一组增加N %?

Ibis中是否有一个ANY或ANY_UTE表达,可以让我比较子查询返回的一组值中的值?

pyramid 内部数组中的连续序列-两极

在上下文管理器中更改异常类型

提取两行之间的标题的常规表达

使用Keras的线性回归参数估计

如何检测背景有噪的图像中的正方形

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

管道冻结和管道卸载

通过pandas向每个非空单元格添加子字符串

OR—Tools CP SAT条件约束

在Python中动态计算范围

索引到 torch 张量,沿轴具有可变长度索引

使用Python从rotowire中抓取MLB每日阵容