【问题标题】:Iterate over pandas dataframe while updating values在更新值时迭代熊猫数据框
【发布时间】:2020-08-02 02:17:42
【问题描述】:

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

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

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 万行。

【问题讨论】:

    标签: python-3.x pandas datetime


    【解决方案1】:

    使用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 中循环

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

    这里有一个很棒的 stackoverflow conversation 关于这个主题。

    【讨论】:

    • 谢谢! @RichieV因为我需要其他计算的时间信息,最好复制该列,转换一个,计算FinishTime然后删除不需要的列?还是有更好的选择?我怀疑我复制数据的方式超出了我的需要,并试图改进我的编码实践。
    • 在某些情况下,重复列会增加已经很大的内存使用量,避免重复是最好的选择。但是,当您开始探索数据但仍不确定哪种形式和形状更有用时,可以根据需要创建新列。试着先让它发挥作用,然后当你支配它时,你就可以开始优化了。
    猜你喜欢
    • 2014-06-13
    • 2018-12-29
    • 2020-05-17
    • 2015-12-09
    • 2018-02-20
    • 1970-01-01
    • 2018-12-03
    • 2017-03-23
    相关资源
    最近更新 更多