2014-11-24 105 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

相關問題