У меня есть 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
Спасибо! Это похоже на правую сторону (Sampled_id), но если у меня есть дубликаты в Sample_Artists, он присваивает каждому дубликату уникальный идентификатор ... Я понимаю, почему это: потому что вы устанавливаете left_on в выборочную версию, а не в образец версии ... Но я хочу, чтобы оба они использовали одни и те же идентификаторы ... – mikedf
Можете ли вы обновить свое сообщение некоторыми данными, которые демонстрируют проблему, и желаемый результат? – unutbu
Yea. В основном столбец sample_id вообще не использует данные индекса. Я обновил свой пост, чтобы показать проблему. – mikedf