Pandas -创建新列-如果另一个列值在列表中(正确的方式)



我一直在努力制作一个新的专栏,根据"一周中的一天"专栏来说明周末或不。我使用以下代码基于之前的堆栈溢出问题。

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()

虽然上面的代码产生了预期的效果-我得到了一个警告,声明:

ippython -input-21-e273917f31f9:6: SettingWithCopyWarning:一个值是试图在数据帧的切片副本上进行设置。试着用.loc[row_indexer,col_indexer] = value

如何绕过这个问题,我已经阅读了如何创建新列的文档,但是这似乎只适用于更简单的列创建。

我还在摸索Python和数据分析,很高兴能收到大家的反馈。

将你的字典颠倒成这样

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

然后基于该weekend_classification字典构建一个新的数据框架,以与现有的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

因为你的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。这就是错误消息所描述的内容。确保在创建dfdf有自己的数据。对其他DataFrame进行过滤,如:

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

或使用copy.deepcopy()处理复杂数据

相关内容

  • 没有找到相关文章

最新更新