2014-11-24 2 views
1

У меня есть 2 dataframes. Один кадр данных имеет четыре столбца: «Sample_Artists», «Sample_Songs», «Sampled_Songs» и «Sampled_Artists». Другая часть данных имеет два столбца: «Художники» и «Песни». Второй блок данных содержит все те же имена исполнителей и песен, что и первый, но первый фреймворк содержит реляционные данные, которые я хотел бы сохранить (другими словами, все пары исполнителей и песен, содержащиеся в первом кадре данных, являются уникальными строками во втором кадр данных).Как создать столбец «ID» в одной фреймворке данных на основе индекса другого фрейма?

По сути, я хочу создать еще два столбца в моем первом фрейме данных, который использует индекс моего второго фрейма данных как идентификатор, такой, что для каждой уникальной пары Artist и Song у меня есть соответствующий индекс из моих вторых данных Рамка.

Вот простой пример того, что я хочу сделать:

Скажем, у меня есть

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

Тогда у меня есть еще один 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 Sample_ID Sampled_ID 
A+   foo   B+    bar   0   2 
A+   foobar  C+    barfoo  1   4 
B+   5   A+    foobar  3   0 

Это кажется супер простым, но я не могу понять, с чего начать. Я сделал что-то похожее на это с groupby, но не смог получить мои индексы в соответствии с моим вторым фреймворком данных (df1 в примере).

Edit:

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 

Так что ваш код дает мне Sample_ID и Sampled_ID, равный 3 (индекс 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, он присваивает каждому дубликату уникальный идентификатор ... Я понимаю, почему это: потому что вы устанавливаете left_on в выборочную версию, а не в образец версии ... Но я хочу, чтобы оба они использовали одни и те же идентификаторы ... – mikedf

+0

Можете ли вы обновить свое сообщение некоторыми данными, которые демонстрируют проблему, и желаемый результат? – unutbu

+0

Yea. В основном столбец sample_id вообще не использует данные индекса. Я обновил свой пост, чтобы показать проблему. – mikedf

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