2015-06-29 2 views
1

У меня есть следующие DataFrame (переформатирован немного):Получение списка диапазона 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) 

, но это приводит к TypeError:

"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: «Объект« Серии »не имеет атрибута« l_bought ». Есть идеи? – nocoolsoft

+0

Это не дает мне сообщение об ошибке на [моей установке] (http://imgur.com/xmbwutu) (Python 2.7, pandas 0.16.1). Сообщение означает, что 'Series', отправленный' buy_range' (который должен быть строкой вашего DataFrame), не имеет индекса/столбца, называемого 'l_bought'. Проверьте наличие опечаток в коде и именах столбцов. Вы также можете поместить 'print (row.index)' just before' return range (... ', чтобы узнать, что получает' purchase_range'. – LondonRob

+0

@LondonRob +1 для вашего решения, хотя вы не хотите включать максимальное число для полного диапазона? – kennes

Смежные вопросы