【问题标题】:Creating Columns Inside Loops In Python在 Python 中的循环内创建列
【发布时间】:2021-07-12 13:04:40
【问题描述】:

我正在运行以下命令,在循环中创建名为 NEW_DATE 的新列。 我想为每一行,循环计算一个间隔,然后将该间隔与DATE相加,结果存储在NEW_DATE中。

数据框如下所示:

    DATE        INFO
0   2021-01-22  0.375
1   2020-12-04  0.125
2   2021-01-01  0.500
3   2020-12-24  0.375
4   2020-12-10  0.125

代码是这样的:

df['DATE'] = pd.to_datetime(df['DATE'], format='%Y%m%d')

for index, row in df.iterrows():
    c1 = df['INFO'][index]
    print(c1)
    
    c3 = datetime.timedelta((1/c1)*5)
    print(c3)

    c2 = df['DATE'][index]
    print(c2)   
    
    df['NEW_DATE'][index] = c2 + c3
    print(df['NEW_DATE'][index], '\n')

目前我收到以下错误: KeyError: 'NEW_DATE'

如果我删除 write df['NEW_DATE'][index] = c2 + c3,代码会运行,但存储在 NEW_DATE 中的值不正确,因为它们与打印的不同。

我该如何做我上面描述的事情?我走对了吗?

【问题讨论】:

  • 看起来您需要在尝试为每一行设置值之前将NEW_DATE 列添加到您的数据框中。您可以搜索“pandas add column to dataframe”以了解几种方法。

标签: python pandas numpy loops jupyter-notebook


【解决方案1】:

如果您想坚持该解决方案,请先在 for 循环之前创建空列,例如:

df['NEW_DATE'] = np.nan
# for loop ...

要分配值,您可能需要使用 loc

df.loc[index, 'NEW_DATE'] = c2 + c3

一般来说itterrows()很慢,一般这类问题应该用向量化的方法解决:

df['NEW_DATE'] = df['DATE'] + pd.to_timedelta((1/df['INFO'])*5, unit='D')

【讨论】:

  • 我了解矢量化方法,但是当我运行这两种方法时,NEW_DATE 列值在 itterrows() 的方法上是正确的,而在矢量化方法上是错误的。不知道为什么会这样。就像 c3 必须以天为单位(而不是日期)一样,不确定在矢量化中是否对 c2 的天数求和。你知道如何在矢量化中做到这一点吗?
  • datetime.timedelta 接收第一个参数为天,pd.to_timedelta 默认使用纳秒。使用参数 unit 检查编辑
【解决方案2】:

您收到此错误,因为该列不存在。你需要在循环之前创建它

df['NEW_DATE'] = np.nan

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 2015-12-08
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多