【问题标题】:updating column value as loop over dataframe rows更新列值作为循环数据帧行
【发布时间】:2019-02-01 03:05:53
【问题描述】:

我正在尝试获取链接并通过 TinyURL 推送它们。我有一个包含 Login Links 列的数据框,我想单独获取这些链接并将 tiny_urlize 链接添加到“Tiny URL”列。

for index, row in df.iterrows():
    df.loc[index, 'Tiny Url'] = tiny_urlize(row['Login Link'])

我得到的错误如下所示:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

但这正是我正在做的。我错过了什么吗?

【问题讨论】:

  • df 本身是否是副本(例如,您是否在 df = other_df[some_slice] 之前的某个时间点做过?
  • 不,我从来没有这样做过
  • 你能说明你是如何定义你的df的吗?
  • 它也可能是您不一定希望返回副本的一些方法的结果。例如df = df.drop_duplicates() 可能是罪魁祸首。

标签: python pandas dataframe


【解决方案1】:

此错误可能因多种不同原因而弹出,例如,常见情况是 df 是另一个数据帧的切片。我怀疑如果你在 iterrows 之前写 df = df.copy() 你不会得到错误。

您还可以通过将其写为apply 来简化和加速您的表达:

df['Tiny Url'] = df['Login Link'].apply(tiny_urlize)

我相信这也会阻止警告

【讨论】:

    【解决方案2】:

    问题是您在循环时使用 loc 更新 df 的值(本质上是一个切片)。试试看,

    for index, row in df.iterrows():
        row['Tiny Url'] = tiny_urlize(row['Login Link'])
    

    此外,pandas 内置了对此类事情非常有效的函数,其中之一是 apply

    df['Tiny Url'] = df['Login Link'].apply(tiny_urlize)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2020-06-11
      • 2019-09-21
      相关资源
      最近更新 更多