2017-05-31 101 views
3

我試圖結合兩組數據,但我想不通哪種方法最合適(加入,合併,concat,等等),並且該文檔沒有任何可以做我需要做的事情的例子。熊貓加入/合併/ concat兩個數據幀和組合行的相同的密鑰/索引

我有兩組數據,結構類似這樣:

>>> A 
Time  Voltage 
1.0  5.1 
2.0  5.5 
3.0  5.3 
4.0  5.4 
5.0  5.0 

>>> B 
Time  Current 
-1.0  0.5 
0.0  0.6 
1.0  0.3 
2.0  0.4 
3.0  0.7 

我想數據列結合和「時間」列合併在一起,這樣我得到如下:

>>> AB 
Time  Voltage  Current 
-1.0     0.5 
0.0     0.6 
1.0  5.1   0.3 
2.0  5.5   0.4 
3.0  5.3   0.7 
4.0  5.4    
5.0  5.0    

我試過AB = merge_ordered(A, B, on='Time', how='outer'),而它成功地結合了數據,就輸出一個類似於:

>>> AB 
Time  Voltage  Current 
-1.0     0.5 
0.0     0.6 
1.0  5.1    
1.0     0.3 
2.0  5.5    
2.0     0.4 
3.0  5.3    
3.0     0.7 
4.0  5.4    
5.0  5.0    

您會注意到它沒有將行與共享的「時間」值組合在一起。

我也試圖合併一拉AB = A.merge(B, on='Time', how='outer'),但輸出的東西結合起來,但沒有排序,像這樣:

>>> AB 
Time  Voltage  Current 
-1.0     0.5 
0.0     0.6 
1.0  5.1    
2.0  5.5    
3.0  5.3   0.7 
4.0  5.4    
5.0  5.0    
1.0     0.3 
2.0     0.4 

...它基本上是跳過一些在「當前」數據和將其附加到底部,但它不一致。而且,它不會將行合併在一起。

我有嘗試AB = pandas.concat(A, B, axis=1),但結果不合並。我簡單地得到,那麼,這兩個DataFrames的級聯,像這樣:

>>> AB 
Time  Voltage  Time  Current 
1.0  5.1   -1.0  0.5 
2.0  5.5   0.0  0.6 
3.0  5.3   1.0  0.3 
4.0  5.4   2.0  0.4 
5.0  5.0   3.0  0.7 

我一直精練的文檔和這裏揣摩mergejoin之間的確切差別,但是從我收集他們非常相似。儘管如此,我還沒有找到任何具體回答「如何合併具有相同關鍵字/索引的行」的問題。任何人都可以啓發我如何做到這一點?我只有幾天的大熊貓經驗!

+0

確保'Time'列在這兩個的DF – MaxU

+0

相同的D型你移動你的?請解答一個答案框?我們不會在這裏提出解決方案你想問問這是否是一個很好的解決方案,你可以問問有其他答案的人。 – halfer

+0

@halfer看起來像你爲我編輯我的帖子。我還需要做什麼?恐怕我不知道你指的是什麼答案框...... –

回答

3

merge
merge結合了列。默認情況下,它採用所有通常命名的列。否則,您可以指定要組合的列。在這個例子中,我選擇了Time

A.merge(B, 'outer', 'Time') 

    Time Voltage Current 
0 1.0  5.1  0.3 
1 2.0  5.5  0.4 
2 3.0  5.3  0.7 
3 4.0  5.4  NaN 
4 5.0  5.0  NaN 
5 -1.0  NaN  0.5 
6 0.0  NaN  0.6 

join
join結合了索引值,除非您指定左側的列來代替。這就是爲什麼我設置右側的索引併爲左側指定一個列Time

A.join(B.set_index('Time'), 'Time', 'outer') 

    Time Voltage Current 
0 1.0  5.1  0.3 
1 2.0  5.5  0.4 
2 3.0  5.3  0.7 
3 4.0  5.4  NaN 
4 5.0  5.0  NaN 
4 -1.0  NaN  0.5 
4 0.0  NaN  0.6 ​ 

pd.concat
concat結合了指數值...所以我創建了一個列表理解,其中我遍歷了每個要合併的數據幀[A, B]。在理解中,每個數據框都假定名稱爲d,因此爲for d in [A, B]axis=1表示將它們並排組合使用,因此使用索引作爲連接特徵。

pd.concat([d.set_index('Time') for d in [A, B]], axis=1).reset_index() 

    Time Voltage Current 
0 -1.0  NaN  0.5 
1 0.0  NaN  0.6 
2 1.0  5.1  0.3 
3 2.0  5.5  0.4 
4 3.0  5.3  0.7 
5 4.0  5.4  NaN 
6 5.0  5.0  NaN 

combine_first

A.set_index('Time').combine_first(B.set_index('Time')).reset_index() 

    Time Current Voltage 
0 -1.0  0.5  NaN 
1 0.0  0.6  NaN 
2 1.0  0.3  5.1 
3 2.0  0.4  5.5 
4 3.0  0.7  5.3 
5 4.0  NaN  5.4 
6 5.0  NaN  5.0 
+0

那麼在'join'和'merge'的確有什麼區別?有趣。通過你的例子,看起來'concat'的結果正是我所期望的,儘管有一些我不明白其功能的論點。你能解釋那裏發生了什麼? 'd'從哪裏來? 'reset_index'的目的是什麼? (我以爲'時間'_was是我的索引?) –

+0

爲了在這種情況下擴展'concat'的用法:我試圖按照你寫的那樣實現它,但是導致與'merge'類似的輸出。也就是說:如我所希望的那樣,將數據合併爲_mostly_,但每個第N行都不合並,如我原來的帖子所示。 考慮到多種方法產生相同的結果,在我看來,問題不一定是方法,而是我的數據。這是否與尺寸有關?速度?什麼會導致它經常跳過組合行? –

+1

我認爲@MaxU正在識別你的問題。在加入之前嘗試'A = A.astype.float()'和'B = B.astype(float)'。 – piRSquared

2

應該正常工作,如果Time列在兩個話語結構相同的D型細胞:

In [192]: A.merge(B, how='outer').sort_values('Time') 
Out[192]: 
    Time Voltage Current 
5 -1.0  NaN  0.5 
6 0.0  NaN  0.6 
0 1.0  5.1  0.3 
1 2.0  5.5  0.4 
2 3.0  5.3  0.7 
3 4.0  5.4  NaN 
4 5.0  5.0  NaN 

In [193]: A.dtypes 
Out[193]: 
Time  float64 
Voltage float64 
dtype: object 

In [194]: B.dtypes 
Out[194]: 
Time  float64 
Current float64 
dtype: object 

再現您的問題:

In [198]: A.merge(B.assign(Time=B.Time.astype(str)), how='outer').sort_values('Time') 
Out[198]: 
    Time Voltage Current 
5 -1.0  NaN  0.5 
6 0.0  NaN  0.6 
0 1.0  5.1  NaN 
7 1.0  NaN  0.3 
1 2.0  5.5  NaN 
8 2.0  NaN  0.4 
2 3.0  5.3  NaN 
9 3.0  NaN  0.7 
3 4.0  5.4  NaN 
4 5.0  5.0  NaN 

In [199]: B.assign(Time=B.Time.astype(str)).dtypes 
Out[199]: 
Time  object # <------ NOTE 
Current float64 
dtype: object 

視覺上很難區分:

In [200]: B.assign(Time=B.Time.astype(str)) 
Out[200]: 
    Time Current 
0 -1.0  0.5 
1 0.0  0.6 
2 1.0  0.3 
3 2.0  0.4 
4 3.0  0.7 

In [201]: B 
Out[201]: 
    Time Current 
0 -1.0  0.5 
1 0.0  0.6 
2 1.0  0.3 
3 2.0  0.4 
4 3.0  0.7 
+0

我已經驗證了這兩個DF中的'時間'列的數據類型是相同的(float64)。按照您的建議使用merge方法會導致類似的不一致的合併,類似於我的初始文章中的A.merge的示例。在這種情況下,數據將被排序,但每第N行不會組合。我希望我可以包括一個例子,但字符數太低... –

+0

@ J.Day,試試這個:'pd.merge_ordered(A.assign(Time = A.Time.round(4)),B.assign (時間= B.Time.round(4)))' – MaxU

+0

我想我明白這是怎麼回事。唯一需要注意的是我的實際數據列名是'Time,(sec)',而不僅僅是'Time'(爲了簡潔起見我簡化了我的第一個例子)。我如何寫這行以適應名字中的額外標點符號? –

0

發現的解決方案 按照下面的建議,我曾在之前的合併他們的「時間」欄,圓的數字儘管他們都是相同的dtype(float64)。該建議是圓像這樣:

A = A.assign(A.Time = A.Time.round(4)) 

但是在我的實際情況,該列被打成「時間(秒)」(有標點符號與分配擰所以不是我用以下行。圍着它

A['Time, (sec)'] = A['Time, (sec)'].round(4) 

和它的工作就像一個魅力是否有任何問題做這樣的