2017-06-28 57 views
2

我想爲pandas DataFrame的前n行設置一些值。設置爲大熊貓的第一行DataFrame

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

我想設定「數量」爲先,比方說,5行數19。我真正想要的是「數字」的最低值設置爲該值,所以我只是排序第一。 如果我的指標是小事一樁,我可以做

example.loc[:5-1,'number'] = 19 # -1 for inclusive indexing 
# or 
example.ix[:5-1,'number'] = 19 

但因爲它不是,這會產生以下神器(所有指數值高達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 

使用.iloc []會很好,除了它不接受列名稱。

example.iloc[:5]['number'] = 19 

工作,但給了一個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 

而且因爲我不得不重複這幾個欄目,我每次都,這也花了我我的索引來此做了幾次,重置索引(但不要介意)。

有沒有人有一個更好的解決方案?

回答

1
example.loc[example.index[:5], 'number'] = 19 
+0

這隻適用於索引不重複的情況。 example = pd.DataFrame({'number':range(10),'name':list('aaabbbcccc')},index = range(10,0,-2)* 2) example.loc [例子。 index [:5],'number'] = 19 將無法​​按預期工作,它將設置爲重複索引。 – ErnestScribbler

+0

@ErnestScribbler你試過了嗎?首先,你沒有指定你的索引是不唯一的。這通常是你想要包括在你的例子中,如果它是你所關心的東西。其次,我運行了一個重複索引的例子,它運行良好。第三,如果你堅持'example.loc [example.index [:5] .unique(),'number'] = 19' – piRSquared

2

我會使用.iloc作爲.loc可能會產生意想不到的結果,如果某些索引重複。

example.iloc[:5, example.columns.get_loc('number')] = 19