2015-06-29 72 views
1

範圍的名單我有以下數據框(格式化了一下):獲得2分大熊貓列

f_name l_name  n f_bought l_bought 
0 Abraham Livingston 24 1164  1187 
1 John Brown  4 1188  1191 
2 Samuel Barret  16 1192  1207 
3 Nathan Blodget  4 1208  1212 
4 Bobby Abraham  1 1212  1212 

我想創建一個列,bought,這是一個列表range(df[f_bought], df[l_bought])

我已經試過:

def getRange(l1,l2): 
    r = list(range(l1, l2)) 
df.apply(lambda index: getRange(df['f_bond'], df['l_bond']),axis=1) 

但它會導致類型錯誤:

"cannot convert the series to <type 'int'>", u'occurred at index 0' 

我已經嘗試了df.info(),都列類型的Int64。

我想知道是否應該使用類似df.loc[]或類似的東西?還是其他什麼東西?

回答

1

您應該可以使用apply這樣做,它用於將函數應用於數據框的每一行或每列。

def bought_range(row): 
    return range(row.f_bought, row.l_bought) 

df['bought_range'] = df.apply(bought_range, axis=1) 

導致:

f_name  l_name n f_bought l_bought \ 
0 Abraham Livingston 24  1164  1187 
1  John  Brown 4  1188  1191 
2 Samuel  Barret 16  1192  1207 
3 Nathan  Blodget 4  1208  1212 
4 Bobby  Abraham 1  1212  1212 

             bought_range 
0 [1164, 1165, 1166, 1167, 1168, 1169, 1170, 117... 
1         [1188, 1189, 1190] 
2 [1192, 1193, 1194, 1195, 1196, 1197, 1198, 119... 
3       [1208, 1209, 1210, 1211] 
4             [] 

一個提醒一句的是,Python的range不包括上限:

In [1]: range(3, 6) 
Out[1]: [3, 4, 5] 

這不是很難對付(return range(row.f_bought, row.l_bought + 1))但確實需要考慮。

+0

這變得非常接近,但它引發了一個AttributeError:「'Series'對象沒有屬性'l_bought'」。有任何想法嗎? – nocoolsoft

+0

它不會給我[我的安裝](http://imgur.com/xmbwutu)(Python 2.7,pandas 0.16.1)上的錯誤消息。這個消息意味着發送到'buying_range'的'Series'(它應該是你的'DataFrame'的一行)沒有名爲'l_bought'的索引/列。檢查代碼中的拼寫錯誤和列名。你也可以在'return range(...'前面加'print(row.index)'來看看'buying_range'正在變得多少。 – LondonRob

+0

@LondonRob +1對於你的解決方案雖然你不想包含最大數量對於完整的範圍? – kennes