Python pandas:基于位置而非索引值替换数值

9

这里是我的数据框:

In[12]: df  = pd.DataFrame(data = list("aabbcc"), columns = ["s"], index=range(11,17))
In[13]: df
Out[13]: 
    s
11  a
12  a
13  b
14  b
15  c
16  c

让我们尝试根据索引替换值:

In[14]: df.loc[11, "s"] = 'A'
In[15]: df
Out[15]: 
    s
11  A
12  a
13  b
14  b
15  c
16  c
In[16]: df.ix[12, "s"] = 'B'
In[17]: df
Out[17]: 
    s
11  A
12  B
13  b
14  b
15  c
16  c

它有效!但是如果我按位置而不是索引来做同样的事情,就像这样,但它会显示ValueError ( ValueError: Can only index by location with a [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array]):

In[18]: df.iloc[1, "s"] = 'b'

如果我尝试这样做:

df.s.iloc[1] = "b"

我收到了以下警告:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

2
你遇到的第一个错误是因为你试图使用基于整数的索引来访问字符串。尝试使用 df.iloc[1, 0] = 'b'。这是你正在运行的完整代码吗?当我运行 df.s.iloc[1] = "b" 时,没有出现错误。如果 df 是通过切片另一个数据帧创建的,则会看到你遇到的警告。 - johnchase
1个回答

15
您可以使用get_loc来获取列的位置,并将其传递给iloc:
df.iloc[1, df.columns.get_loc('s')] = 'B'

df
Out: 
    s
11  a
12  B
13  b
14  b
15  c
16  c

或者反过来:

df.loc[df.index[1], 's'] = 'B'

4
我不理解这种行为的设计。为什么要强制用户通过额外的函数调用来提供命名列的索引? - Gulzar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接