2014-11-24 5 views
1

데이터 프레임이 2 개 있습니다. 하나의 데이터 프레임에는 'Sample_Artists', 'Sample_Songs', 'Sampled_Songs'및 'Sampled_Artists'의 4 개의 열이 있습니다. 다른 데이터 프레임에는 'Artists'와 'Songs'라는 두 개의 열이 있습니다. 두 번째 데이터 프레임에는 첫 번째 데이터 프레임과 동일한 아티스트 및 곡 이름이 포함되어 있지만 첫 번째 데이터 프레임에는 관계형 데이터가 포함되어 있습니다 (즉, 첫 번째 데이터 프레임에 포함 된 모든 아티스트 및 노래 쌍이 두 번째 데이터 프레임에서 고유 한 행입니다. 데이터 프레임).다른 데이터 프레임의 인덱스를 기반으로 한 데이터 프레임에 "ID"열을 어떻게 만들 수 있습니까?

기본적으로 내 두 번째 데이터 프레임의 인덱스를 ID로 사용하는 첫 번째 데이터 프레임에 두 개의 열을 추가하여 각 고유 한 아티스트 및 노래 쌍에 대해 두 번째 데이터에서 일치하는 인덱스를 갖습니다. 틀. 여기

내가 뭘 원하는지의 간단한 예제 : 다음 나는 두 개의 열을 추가 할 이제 다른 dataframe

df1 = 
index Artist Song 
0  A+  foo 
1  A+  foobar 
2  B+  bar 
3  B+  5 
4  C+  barfoo 

내가

df = 
Sample_Artist Sample_Song Sampled_Artist Sampled_Song 
A+   foo   B+    bar 
A+   foobar  C+    barfoo 
B+   5   A+    foobar 

이 말 내 첫 번째 데이터 프레임 :

df = 
Sample_Artist Sample_Song Sampled_Artist Sampled_Song Sample_ID Sampled_ID 
A+   foo   B+    bar   0   2 
A+   foobar  C+    barfoo  1   4 
B+   5   A+    foobar  3   0 

이것은 매우 간단하지만, 어디서부터 시작해야하는지 알 수 없습니다. groupby를 사용하여 이와 비슷한 작업을했지만 내 인덱스를 두 번째 데이터 프레임 (이 예제의 df1)과 일치시키지 못했습니다.

편집 :

import io 
import pandas as pd 

df = pd.read_table(io.BytesIO('''\ 
Sample_Artist Sample_Song Sampled_Artist Sampled_Song 
A+   foo   B+    bar 
A+   foobar  C+    barfoo 
B+   5   A+    foobar 
A+   foo   B+    5'''), sep='\s+') 

df1 = pd.read_table(io.BytesIO('''\ 
Artist Song 
A+  foo 
A+  foobar 
B+  bar 
B+  5 
C+  barfoo'''), sep='\s+') 

df.index.names = ['Sample_ID'] 
df1.index.names = ['Sampled_ID'] 
df = df.reset_index() 
df1 = df1.reset_index() 
result = pd.merge(df, df1, left_on=['Sampled_Artist', 'Sampled_Song'], 
    right_on=['Artist', 'Song'], 
    how='left') 

result = result[['Sample_Artist', 
       'Sample_Song', 
       'Sampled_Artist', 
       'Sampled_Song', 
       'Sample_ID', 
       'Sampled_ID']] 


print(result) 


    Sample_Artist Sample_Song Sampled_Artist Sampled_Song Sample_ID Sampled_ID 
0   A+   foo    B+   bar   0   2 
1   A+  foobar    C+  barfoo   1   4 
2   B+   5    A+  foobar   2   1 
3   A+   foo    B+   5   3   3 

그래서 코드가 나에게 3와 동일한 Sample_ID과 Sampled_ID 제공

(가 제공해야 인덱스 3, Sample_ID = 0 Sample_ID = 3). 전체 Sample_ID 열이 꺼져 있고 (Sampled_ID가 좋음) 정확한 이유를 파악할 수 없습니다.

나는보고 싶습니다

Sample_Artist Sample_Song Sampled_Artist Sampled_Song Sample_ID Sampled_ID 
0   A+   foo    B+   bar   0   2 
1   A+  foobar    C+  barfoo   1   4 
2   B+   5    A+  foobar   3   1 
3   A+   foo    B+   5   0   3 

답변

0
import io 
import pandas as pd 

df = pd.read_table(io.BytesIO('''\ 
Sample_Artist Sample_Song Sampled_Artist Sampled_Song 
A+   foo   B+    bar 
A+   foobar  C+    barfoo 
B+   5   A+    foobar 
A+   foo   B+    5'''), sep='\s+') 

df1 = pd.read_table(io.BytesIO('''\ 
Artist Song 
A+  foo 
A+  foobar 
B+  bar 
B+  5 
C+  barfoo'''), sep='\s+') 


df1.index.names = ['Sampled_ID'] 
df1 = df1.reset_index() 

grouped = df.groupby(['Sample_Artist', 'Sample_Song']) 
df['Sample_ID'] = grouped['Sample_Artist'].transform(
    lambda grp: grp.index.get_level_values(0)[0]) 

result = pd.merge(df, df1, left_on=['Sampled_Artist', 'Sampled_Song'], 
    right_on=['Artist', 'Song'], 
    how='left') 

result = result[['Sample_Artist', 
       'Sample_Song', 
       'Sampled_Artist', 
       'Sampled_Song', 
       'Sample_ID', 
       'Sampled_ID']] 


print(result) 

수익률

Sample_Artist Sample_Song Sampled_Artist Sampled_Song Sample_ID Sampled_ID 
0   A+   foo    B+   bar   0   2 
1   A+  foobar    C+  barfoo   1   4 
2   B+   5    A+  foobar   2   1 
3   A+   foo    B+   5   0   3 
+0

감사합니다! 이것은 오른쪽 (sampled_id의)에서 작동하는 것처럼 보이지만 Sample_Artists에 중복이 있으면 각각의 고유 한 ID가 할당됩니다. 왜 이것이 표시되는지는 샘플링 된 버전 대신 left_on을 설정했기 때문입니다. 샘플 버전 ...하지만 둘 다 동일한 ID를 사용하고 싶습니다 ... – mikedf

+0

문제를 설명하는 데이터와 원하는 결과로 게시물을 업데이트 할 수 있습니까? – unutbu

+0

예. 기본적으로 sample_id 열은 인덱스 데이터를 전혀 사용하지 않습니다. 내 게시물을 업데이트하여 문제를 표시했습니다. – mikedf

관련 문제