2014-09-03 93 views
1

我有一個很大的DataFrame(600k,2),名爲data,基本上我在第二列中有一組沿着數據分佈的50k唯一值。如何有效地替換熊貓DataFrame上的值?

的數據看起來像這樣

image_id  term 
0 56127  23001 
1 56127  763003 
2 56127  51002 
3 26947  581007 
4 26947  14001 
5 26947  95000 
6 26947  92000 
7 26947  62004 
8 26947  224007 
...600k more 

在另一方面,我有一個名爲系列terms_indexed這個50K的術語是這樣組成的指數。

  NewTerm 
Term     
23001   9100 
763003   402 
51002   10608 
581007   900 
14001   42107 
95000   900 
92000   4002 
62004   42107 
224007   9100 
...50k more 

但我想重新使用帶索引項的系列在原始DataFrame中重新使用這些值。到目前爲止,我已經做了以下行

for i in range(data.shape[0]): 
     data.loc[i, 'term'] = int(terms_indexed.ix[data.iloc[i][1]]) 

然而,這需要很多時間來做這個替換操作。在Intel Core i7中使用8GB RAM約35分鐘。我想知道是否有更好的方法來做這個操作。在此先感謝

+2

如果您在大df上的「term」列中設置索引,則可以調用['update'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame。 update.html)like large_df.update(other_df)' – EdChum 2014-09-03 21:09:14

+0

這可能是有光澤的分類dtype(用於術語列)的用例。 – 2014-09-03 21:53:15

回答

4

如果我理解你的情況正確,你可以做df['term'] = df['term'].map(terms_indexed)。做series1.map(series2)「翻譯」系列1通過使用它的值作爲索引到系列2。

+0

我只是將'update'與'map'進行了比較,並且對'map'超越'update'有點驚訝,對於90k數據幀'update'需要19.4ms對於'map' 8.61ms。 – EdChum 2014-09-03 21:20:33

+0

我之所以這樣說是因爲Jeff總是向我評論說map和apply是最後的手段,所以我認爲update會更好的表現 – EdChum 2014-09-03 21:22:13

+0

@EdChum:我認爲帶函數參數的map可以慢。帶有一系列參數的'map'應該相當快。但是我不支持熊貓內部,所以我不知道。 – BrenBarn 2014-09-03 21:23:24