2014-04-07 7 views
0

ID 목록을 기반으로 pandas DataFrame을 만들었습니다.다른 하나를 기반으로 한 Pandas DataFrame 슬라이스

In [8]: df = pd.DataFrame({'groups' : [1,2,3,4], 
       'id' : ["[1,3]","[2]","[5]","[4,6,7]"]}) 
Out[9]: 
    groups  id 
0  1 [1,3] 
1  2  [2] 
2  3  [5] 
3  4 [4,6,7] 

다음과 같은 또 다른 DataFrame가 있습니다.

In [12]: df2 = pd.DataFrame({'id' : [1,2,3,4,5,6,7], 
       'path' : ["p1,p2,p3,p4","p1,p2,p1","p1,p5,p5,p7","p1,p2,p3,p3","p1,p2","p1","p2,p3,p4"]}) 

각 그룹에 대한 경로 값을 가져와야합니다. 예컨대

groups path 
1  p1,p2,p3,p4 
     p1,p5,p5,p7 
2  p1,p2,p1 
3  p1,p2 
4  p1,p2,p3,p3 
     p1 
     p2,p3,p4 

답변

0

은 내가 그것을 할 수있는 아주 좋은 방법입니다 모르겠지만, 나를 위해 일했다. 당신이 ... 목록이 아닌 문자열로 즉, ""부호없이 DF 1의 id 변수를 생성

import itertools 

df = pd.DataFrame({'groups' : [1,2,3,4], 
        'id' : [[1,3],[2],[5],[4,6,7]]}) 
df2 = pd.DataFrame({'id' : [1,2,3,4,5,6,7], 
        'path' : ["p1,p2,p3,p4","p1,p2,p1","p1,p5,p5,p7","p1,p2,p3,p3","p1,p2","p1","p2,p3,p4"]}) 

paths = [[] for group in df.groups.unique()] 
for x in df.index: 
    paths[x].extend(itertools.chain(*[list(df2[df2.id == int(y)]['path']) for y in df.id[x]]))          
df['paths'] = pd.Series(paths) 
df 

가 홀수가 아마이 일을 훨씬 더 깔끔한 방법이지만, 경우에 덧붙여이 유일한 작품 데이터 구조. 당신은 당신의 DataFrame 포함 된 것으로 list 객체를 구성하지 않아야 다음과 같은 출력

groups id   paths 
0 1  [1, 3]  [p1,p2,p3,p4, p1,p5,p5,p7] 
1 2  [2]   [p1,p2,p1] 
2 3  [5]   [p1,p2] 
3 4  [4, 6, 7]  [p1,p2,p3,p3, p1, p2,p3,p4] 
0

에게 제공합니다. 대신 ID의 길이에 따라 그룹을 반복 한 다음을 입력하십시오.

In [143]: groups = list(range(1, 5)) 

In [144]: ids = [[1, 3], [2], [5], [4, 6, 7]] 

In [145]: df = DataFrame({'groups': np.repeat(groups, list(map(len, ids))), 'id': reduce(lambda 
x, y: x + y, ids)}) 

In [146]: df2 = pd.DataFrame({'id' : [1,2,3,4,5,6,7], 
       'path' : ["p1,p2,p3,p4","p1,p2,p1","p1,p5,p5,p7","p1,p2,p3,p3","p1,p2","p1","p 
2,p3,p4"]}) 

In [147]: df 
Out[147]: 
    groups id 
0  1 1 
1  1 3 
2  2 2 
3  3 5 
4  4 4 
5  4 6 
6  4 7 

[7 rows x 2 columns] 

In [148]: df2 
Out[148]: 
    id   path 
0 1 p1,p2,p3,p4 
1 2  p1,p2,p1 
2 3 p1,p5,p5,p7 
3 4 p1,p2,p3,p3 
4 5  p1,p2 
5 6   p1 
6 7  p2,p3,p4 

[7 rows x 2 columns] 

In [149]: pd.merge(df, df2, on='id', how='outer') 
Out[149]: 
    groups id   path 
0  1 1 p1,p2,p3,p4 
1  1 3 p1,p5,p5,p7 
2  2 2  p1,p2,p1 
3  3 5  p1,p2 
4  4 4 p1,p2,p3,p3 
5  4 6   p1 
6  4 7  p2,p3,p4 

[7 rows x 3 columns] 
관련 문제