Pandas - 根据索引替换值
Posted
技术标签:
【中文标题】Pandas - 根据索引替换值【英文标题】:Pandas - Replace values based on index 【发布时间】:2016-10-10 01:28:22 【问题描述】:如果我像这样创建一个数据框:
import pandas as pd, numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=list('AB'))
例如,我如何将 A 列中的条目更改为第 0 -15 行的数字 16?换句话说,我如何完全基于索引替换单元格?
【问题讨论】:
【参考方案1】:使用loc
:
df.loc[0:15,'A'] = 16
print (df)
A B
0 16 45
1 16 5
2 16 97
3 16 58
4 16 26
5 16 87
6 16 51
7 16 17
8 16 39
9 16 73
10 16 94
11 16 69
12 16 57
13 16 24
14 16 43
15 16 77
16 41 0
17 3 21
18 0 98
19 45 39
20 66 62
21 8 53
22 69 47
23 48 53
ix
的解决方案是deprecated。
【讨论】:
这现在给出了一个 FutureWarning:不支持使用 .loc 对位置切片进行切片。 df.A.iloc[0:15] = 16 应该仍然有效。【参考方案2】:另一种解决方案是
df.at[0:15, 'A']=16
print(df.head(20))
输出:
A B
0 16 44
1 16 86
2 16 97
3 16 79
4 16 94
5 16 24
6 16 88
7 16 43
8 16 64
9 16 39
10 16 84
11 16 42
12 16 8
13 16 72
14 16 23
15 16 28
16 18 11
17 76 15
18 12 38
19 91 6
【讨论】:
【参考方案3】:除了其他答案之外,如果您有单个索引列表,您可以执行以下操作:
indices = [0,1,3,6,10,15]
df.loc[indices,'A'] = 16
print(df.head(16))
输出:
A B
0 16 4
1 16 4
2 4 3
3 16 4
4 1 1
5 3 0
6 16 4
7 2 1
8 4 4
9 3 4
10 16 0
11 3 1
12 4 2
13 2 2
14 2 1
15 16 1
【讨论】:
【参考方案4】:非常有趣的观察,下面的代码确实改变了原始数据帧中的值
df.loc[0:15,'A'] = 16
但如果你使用类似这样的代码
df.loc[0:15]['A'] = 16
它只会返回您数据帧的 副本,其值已更改,并且不会更改原始 df 对象中的值. 希望这将为处理此问题的人节省一些时间。
【讨论】:
这称为“链式分配”,pandas 文档建议不要这样做 (pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html)【参考方案5】:您能否将该列的值更新为 -1.0 而不是 16?对我来说,它返回 255 而不是 -1.0。
>>> effect_df.loc[3:5, ['city_SF', 'city_Seattle']] = -1.0
Rent city_SF city_Seattle
0 3999 1 0
1 4000 1 0
2 4001 1 0
3 3499 255 255
4 3500 255 255
5 3501 255 255
6 2499 0 1
7 2500 0 1
8 2501 0 1
【讨论】:
以上是关于Pandas - 根据索引替换值的主要内容,如果未能解决你的问题,请参考以下文章