2017-02-06 3 views
2

Допустим, у меня есть следующий dataframe:Панды: Агрегирование списки dataframe

VehID Material JobNo 
0 10000  5005 [1, 2] 
1 10000  5100 [1, 2, 4, 5, 6] 
2 10001  5222 [2, 3, 4] 
3 10001  5888 [1, 3] 

Я хотел бы вытаскивать случаи, когда элементы списка в «JobNo» происходит в последовательном моде. Например, для:

VehID Material JobNo  Len 
0 10000  5005 [1, 2]  2 
1 10000  5100 [1, 2]  2 
2 10000  5100 [5, 6]  2 
3 10001  5222 [2, 3, 4] 3 

У кого-нибудь есть опрятное решение? Любая помощь приветствуется. Заранее спасибо!

ответ

0

использование numpy.diff, numpy.split разбить списки, где не-contigous

def split_jobs(x): 
    return np.split(x, np.where(np.append(False, np.diff(x) != 1))[0]) 

j = df.JobNo.apply(split_jobs) 
l1 = j.str.len() 

slc = np.arange(len(df)).repeat(l1) 
d1 = pd.DataFrame(dict(
     VehID=df.VehID.values[slc], 
     Material=df.Material.values[slc], 
     JobNo=list(chain(*j.tolist())) 
    ))[df.columns.tolist()] 

d1[d1.JobNo.str.len() > 1] 

    VehID Material  JobNo 
0 10000  5005  [1, 2] 
1 10000  5100  [1, 2] 
2 10000  5100 [4, 5, 6] 
3 10001  5222 [2, 3, 4] 
+0

Спасибо за быстрый ответ! Ваш ответ работает хорошо, с небольшой модификацией «np.arange (len (df)). Repeat (l1)». Кроме того, программа выдает следующую ошибку: не может передавать данные массива из dtype ('int64') в dtype ('int32') в соответствии с правилом 'safe' – javelina

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