【问题标题】:Pandas - Create new column - if another column value is in list (correct way)熊猫 - 创建新列 - 如果另一个列值在列表中(正确的方式)
【发布时间】:2021-05-30 14:07:27
【问题描述】:

我一直在努力根据“星期几”列创建一个说明周末或不说明周末的新列。我正在使用基于之前的 Stack Overflow 问题的以下代码。

weekday_classification = {
    'Weekday': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
    'Weekend': ['Saturday', 'Sunday']
    }
weekday_classification = {day: all_days for all_days, l in weekday_classification.items() for day in l}
df["Weekend"] = df['Day of Week'].map(weekday_classification)
df.head()

虽然上面的代码产生了预期的效果 - 我收到了一条警告,其中指出:

ipython-input-21-e273917f31f9:6: SettingWithCopyWarning: 值为 试图在数据帧的切片副本上设置。尝试使用 .loc[row_indexer,col_indexer] = value 而不是

有什么方法可以解决这个问题,我已经阅读了说明如何创建新列的文档,但这似乎仅适用于更简单的列创建。

我仍然只是在使用 Python 和数据分析来摸索,我很高兴收到一般性反馈。

【问题讨论】:

标签: python pandas


【解决方案1】:

因为您的 df 是另一个 DataFrame 的“子集”。您可能已经对另一个 DataFrame 的列进行了一些过滤以生成此 df,例如:

df = df_p[df_p['some_col'].isin(some_set)]

Pandas 可以简单地创建对 df_p 部分的引用来呈现 df,而不是实际创建 df。在这种情况下,df 将类似于df_p 的一部分,修改df 将导致警告,因为这可能会影响df_p。这就是错误消息的描述。 确保df 在创建df 时拥有自己的数据。对其他 DataFrame 进行过滤,例如:

df = df_p[df_p['some_col'].isin(some_set)].copy()

或者对复杂的数据使用 copy.deepcopy()。

【讨论】:

  • 非常感谢您的洞察力。你是完全正确的 - 我在我的笔记本上创建了一个子集。我会记住继续使用 copy() 。
【解决方案2】:

把你的字典倒过来,变成这样

weekday_classification = {
                            'Monday': 'Weekday',
                            'Tuesday': 'Weekday',
                            'Wednesday': 'Weekday',
                            'Thursday': 'Weekday',
                            'Friday': 'Weekday',
                            'Saturday': 'Weekend',
                            'Sunday': 'Weekend'
                         }

然后基于该weekend_classification dict 构造一个新的数据框,以加入您现有的df

In []: days = pd.DataFrame(data=weekday_classification.values(), index=weekday_classification.keys(), columns=['Weekday/end'])
       days
Out[]:
                Weekday/end
        Monday      Weekday
       Tuesday      Weekday
     Wednesday      Weekday
      Thursday      Weekday
        Friday      Weekday
      Saturday      Weekend
        Sunday      Weekend

In []: df.join(days, on=df['Day of Week'])
Out[]:
        Day of Week     Weekday/end
    0        Monday         Weekday
    1       Tuesday         Weekday
    2     Wednesday         Weekday
    3      Thursday         Weekday
    4        Friday         Weekday
    5      Saturday         Weekend
    6        Sunday         Weekend

【讨论】:

  • 哇,我需要研究 .join 而不是直接创建列。非常感谢你做的这些。它就像一个魅力。感谢您的帮助!
猜你喜欢
  • 2023-02-05
  • 2018-08-15
  • 2022-12-16
  • 2020-07-07
  • 2021-06-25
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多