在更新值的同时遍历熊猫数据框

时间:2020-08-02 02:17:42

标签: python-3.x pandas datetime

我已经看过很多类似的问题,但是我无法弄清楚如何将这些原则实际应用于我自己的案例。因此,我试图找出一个可以使用的简单示例-基本上,我需要白痴指南,然后才能查看更复杂的示例

考虑一个数据框,该数据框包含名称和时间的列表以及已知的开始时间。然后,我想用完成时间更新数据帧,该完成时间是从开始时间+时间计算的

import pandas as pd
import datetime

df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
                  "Time":[3, 6,1, 7, 23,3,4]})
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')

我知道对于每种情况,我都可以使用来计算结束时间

finishtime = starttine + datetime.datetime.timedelta(minutes = df.iloc[0,1])

我不知道在迭代df行并使用输出更新数据帧中的第三列时如何使用它。

我尝试过

df["FinishTime"] = np.nan

for row in df.itertuples():
    df.at[row,"FinishTime"] = starttine + datetime.datetime.timedelta(minutes = row.Time)

但是它给出了很多我无法解释的错误。我该怎么做?

我知道迭代数据框的建议不是-我不致力于迭代,我只需要某种方法来计算最后一列并将其添加到数据框。我的真实数据大约是20万行。

1 个答案:

答案 0 :(得分:2)

使用pd.to_timedelta()

import datetime
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')
df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
    "Time":[3, 6,1, 7, 23,3,4]})
df.Time = pd.to_timedelta(df.Time, unit='m')
# df = df.assign(FinishTime = df.Time + starttime)
df['FinishTime'] = df.Time + starttime # as pointed out by Trenton McKinney, .assign() is only one way to create new columns
# creating with df['new_col'] has the benefit of not having to copy the full df

print(df)

输出

      Name     Time          FinishTime
0     Kate 00:03:00 2020-02-04 00:03:00
1    Sarah 00:06:00 2020-02-04 00:06:00
2  Isabell 00:01:00 2020-02-04 00:01:00
3   Connie 00:07:00 2020-02-04 00:07:00
4     Elsa 00:23:00 2020-02-04 00:23:00
5     Anne 00:03:00 2020-02-04 00:03:00
6      Lin 00:04:00 2020-02-04 00:04:00

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_timedelta.html

避免不惜一切代价在熊猫圈里玩

也许不惜一切代价,但是pandas利用C实现将性能提高了几个数量级。为方便起见,已经实现了许多功能(很多)。

关于这个主题,这里有很多conversation