我想在某个列中为 Pandas DataFrame 的前 n 行设置一个值。
>>> example = pd.DataFrame({'number':range(10),'name':list('aaabbbcccc')},index=range(20,0,-2)) # nontrivial index
>>> example
name number
20 a 0
18 a 1
16 a 2
14 b 3
12 b 4
10 b 5
8 c 6
6 c 7
4 c 8
2 c 9
Run Code Online (Sandbox Code Playgroud)
我想将第一行的“数字”设置为第 5 行到数字 19。我真正想要的是将“数字”的最低值设置为该值,所以我只先排序。如果我的索引是微不足道的,我可以做
example.loc[:5-1,'number'] = 19 # -1 for inclusive indexing
# or
example.ix[:5-1,'number'] = 19
Run Code Online (Sandbox Code Playgroud)
但由于它不是,这将产生以下工件(其中选择了最多 4 的所有索引值):
>>> example
name number
20 a 19
18 a 19
16 a 19
14 b 19
12 b 19
10 b 19
8 c 19
6 c 19
4 c 19
2 c 9
Run Code Online (Sandbox Code Playgroud)
使用 .iloc[] 会很好,只是它不接受列名。
example.iloc[:5]['number'] = 19
Run Code Online (Sandbox Code Playgroud)
有效,但给出了 SettingWithCopyWarning。
我目前的解决方案是:
>>> example.sort_values('number',inplace=True)
>>> example.reset_index(drop=True,inplace=True)
>>> example.ix[:5-1,'number'] = 19
>>> example
name number
0 a 19
1 a 19
2 a 19
3 b 19
4 b 19
5 b 5
6 c 6
7 c 7
8 c 8
9 c 9
Run Code Online (Sandbox Code Playgroud)
而且由于我必须对几列重复此操作,因此我必须这样做几次并每次都重置索引,这也会花费我的索引(但没关系)。
有没有人有更好的解决方案?
我会使用 .iloc ,因为如果重复某些索引, .loc 可能会产生意想不到的结果。
example.iloc[:5, example.columns.get_loc('number')] = 19
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4296 次 |
| 最近记录: |