将值设置为pandas数据帧的整个列

时间:2017-06-23 13:54:43

标签: python pandas dataframe

我试图将数据帧的整个列设置为特定值。

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。

10 个答案:

答案 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