我试图将数据帧的整个列设置为特定值。
In [1]: df
Out [1]:
issueid industry
0 001 xxx
1 002 xxx
2 003 xxx
3 004 xxx
4 005 xxx
从我所见,loc
是替换数据框中的值时的最佳做法(或者不是吗?):
In [2]: df.loc[:,'industry'] = 'yyy'
但是,我仍然收到了这条谈得很多的警告信息:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
如果我这样做
In [3]: df['industry'] = 'yyy'
我收到了同样的警告信息。
有什么想法吗?使用Python 3.5.2和pandas 0.18.1。
答案 0 :(得分:11)
你可以这样做:
df['industry'] = 'yyy'
答案 1 :(得分:11)
当从现有对象定义新对象时,Python可以做出意想不到的事情。您在上面的评论中表示,您的数据框架是按df = df_all.loc[df_all['issueid']==specific_id,:]
的方式定义的。在这种情况下,df
实际上只是存储在df_all
对象中的行的替代:不在内存中创建新对象。
为了完全避免这些问题,我经常要提醒自己使用copy
模块,该模块明确强制将对象复制到内存中,以便调用新对象的方法不会应用于源对象。我遇到了与你相同的问题,并使用deepcopy
函数避免了它。
在您的情况下,这应该摆脱警告信息:
from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'
编辑:另请参阅David M.在下面的优秀评论!
df = df_all.loc[df_all['issueid']==specific_id,:].copy()
df['industry'] = 'yyy'
答案 2 :(得分:8)
您可以使用assign
函数:
df = df.assign(industry='yyy')
答案 3 :(得分:0)
假设您的数据框架类似于“数据”,您必须考虑您的数据是字符串还是整数。两者都有不同的对待。因此,在这种情况下,您需要具体说明。
Start
现在,如果想要输入数字而不是字母,则必须创建数组
import pandas as pd
data = [('001','xxx'), ('002','xxx'), ('003','xxx'), ('004','xxx'), ('005','xxx')]
df = pd.DataFrame(data,columns=['issueid', 'industry'])
print("Old DataFrame")
print(df)
df.loc[:,'industry'] = str('yyy')
print("New DataFrame")
print(df)
或者如果你正在使用Numpy
list_of_ones = [1,1,1,1,1]
df.loc[:,'industry'] = list_of_ones
print(df)
答案 4 :(得分:0)
df.loc[:,'industry'] = 'yyy'
这很神奇。您为所有行添加带有“:”的“ .loc”。希望对您有帮助
答案 5 :(得分:0)
即使使用这种方法df.loc[:,'industry'] = 'yyy'
,我也遇到过类似的问题,但是一旦刷新笔记本,它就会运行良好。
在拥有df.loc[:,'industry'] = 'yyy'
之后,您可能想尝试刷新单元格。
答案 6 :(得分:0)
如果您只是创建新的但空的数据框,则无法直接为整列签名。这将显示为 NaN,因为系统不知道数据框将有多少行!您需要定义大小或拥有一些现有列。
df = pd.DataFrame()
df["A"] = 1
df["B"] = 2
df["C"] = 3
答案 7 :(得分:-1)
在我看来:
df1 = df [df ['col1'] == some_value] 不会创建新的DataFrame,基本上,df1中的更改将反映在父df中。这导致警告。 鉴于, df1 = df [df ['col1]] == some_value] .copy()将创建一个新的DataFrame,并且df1中的更改不会反映在df中。如果您不想更改原始df,建议使用copy()方法。
答案 8 :(得分:-2)
这为您提供了在行上添加条件,然后更改与那些行相对应的特定列的所有单元格的可能性:
df.loc[(df['issueid'] == '001'), 'industry'] = str('yyy')
答案 9 :(得分:-3)
将您的.loc
行更改为:
df['industry'] = 'yyy'
示例输出
>>> df
issueid industry
0 1 xxx
1 2 xxx
2 3 xxx
3 4 xxx
4 5 xxx
>>> df['industry'] = 'yyy'
>>> df
issueid industry
0 1 yyy
1 2 yyy
2 3 yyy
3 4 yyy
4 5 yyy