2014-11-24 107 views
1

我有2个数据帧。一个数据框有四列:'Sample_Artists','Sample_Songs','Sampled_Songs'和'Sampled_Artists'。另一个数据框有两列:'艺术家'和'歌曲。第二个数据帧包含与第一个数据帧相同的艺术家和歌曲名称,但第一个数据帧包含我想要保留的关系数据(换句话说,第一个数据帧中包含的所有艺术家和歌曲对都是第二个数据帧中的唯一行数据帧)。基本上,我想在我的第一个数据框中创建两个列,它使用我的第二个数据框的索引作为ID,这样对于每个唯一的艺术家和歌曲对,我有一个来自我的第二个数据的匹配索引帧。如何根据另一个数据帧的索引在一个数据帧中创建“ID”列?

这里是什么,我想做一个简单的例子:

说我有

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

然后,我有另据帧

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)。

编辑:

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中有重复项,它将为每个副本分配一个唯一的ID ...我明白了原因:因为您将left_on设置为采样版本而不是示例版本...但我希望他们都使用相同的ID ... – mikedf 2014-11-24 22:18:25

+0

你可以用一些数据来更新你的文章,这些数据说明了问题以及期望的结果? – unutbu 2014-11-24 22:34:37

+0

是的。基本上,sample_id列根本不使用索引数据。我更新了我的帖子以显示问题。 – mikedf 2014-11-24 22:43:07

相关问题