2016-04-26 46 views
1

我有兩個數據幀,我想將它們合併爲1.它們的長度不相等,但包含一些相同的信息。
這裏是第一數據幀合併長度不等的熊貓數據幀

BOROUGH TYPE TCOUNT 
    MAN SPORT 5 
    MAN CONV 3 
    MAN WAGON 2 
    BRO SPORT 2 
    BRO CONV 3 

其中A指定了一個位置,B的類別和C的計數。
而另

BOROUGH CAUSE CCOUNT 
    MAN ALCOHOL 5 
    MAN  SIZE 3 
    BRO ALCOHOL 2 

這裏又是相同的位置,在其他數據幀。但D是另一個類別,E是該位置的D的計數。

我想要什麼(而一直沒能做到)是獲得如下:

BOROUGH TYPE TCOUNT CAUSE CCOUNT 
    MAN SPORT  5 ALCOHOL 5 
    MAN CONV  3  SIZE  3 
    MAN WAGON  2  NaN  NaN 
    BRO SPORT  2 ALCOHOL 2 
    BRO CONV  3  NaN  NaN 

「 - 」可以是任何東西。最好是一個說「Nothing」的字符串。如果他們默認爲NaN值,我想這只是用字符串替換它們的問題。

注意:在使用熊貓和Python

EDIT
輸出:

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 233 entries, 0 to 232 
Data columns (total 3 columns): 
BOROUGH       233 non-null object 
CONTRIBUTING FACTOR VEHICLE 1 233 non-null object 
RCOUNT       233 non-null int64 
dtypes: int64(1), object(2) 
memory usage: 7.3+ KB 
None 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 83 entries, 0 to 82 
Data columns (total 3 columns): 
BOROUGH    83 non-null object 
VEHICLE TYPE CODE 1 83 non-null object 
VCOUNT     83 non-null int64 
dtypes: int64(1), object(2) 
memory usage: 2.6+ KB 
None 
+0

pd.merge(df_One,df_Two,left_on = 'A', 'B'],right_on = 'A', 'd'])你能試試嗎? – Backtrack

+0

好吧,我看到你的問題,df1有233行,但df2只有83行,所以你得到空值由於長度不可思議,你期待什麼,因爲我預計這是預期的操作 – EdChum

+0

我希望我能夠合併這兩個dataframes。基本上填充df2中的所有缺失值。所以如果df1有47個BRONX的值,但df2只有17個,我會用[BRONX,NOTHING,0]填充df2中剩下的30個值。然後我可以合併這兩個數據框。這同樣適用於其他自治市鎮,QUEENS,MANHATTAN,BROOKLYN和STATEN ISLAND –

回答

2

上的列 'A' 中執行left類型merge,對於LHS 'B' 和 'A' ,'D'爲rhs,因爲這些是您的關鍵列

In [16]: 
df.merge(df1, left_on=['A','B'], right_on=['A','D'], how='left') 
​ 
Out[16]: 
    A B C D E 
0 1 1 3 1 5 
1 1 2 2 2 3 
2 1 3 1 NaN NaN 
3 2 1 1 1 2 
4 2 2 4 NaN NaN 

編輯

你的問題發生了變化,但基本上是在這裏,你可以使用combine_first

In [26]: 
merged = df.combine_first(df1) 
merged 

Out[26]: 
    BOROUGH CAUSE CCOUNT TCOUNT TYPE 
0  MAN ALCOHOL  5  5 SPORT 
1  MAN  SIZE  3  3 CONV 
2  MAN ALCOHOL  2  2 WAGON 
3  BRO  NaN  NaN  2 SPORT 
4  BRO  NaN  NaN  3 CONV 

你看到的「原因」的NaN是字符串「男」,我們可以用fillna來代替這些值:

In [27]: 
merged['CAUSE'] = merged['CAUSE'].fillna('Nothing') 
merged['CCOUNT'] = merged['CCOUNT'].fillna(0) 
merged 

Out[27]: 
    BOROUGH CAUSE CCOUNT TCOUNT TYPE 
0  MAN ALCOHOL  5  5 SPORT 
1  MAN  SIZE  3  3 CONV 
2  MAN ALCOHOL  2  2 WAGON 
3  BRO Nothing  0  2 SPORT 
4  BRO Nothing  0  3 CONV 
+0

如果A實際上包含字符串,這是否重要?因爲我的D和E都被設置爲NaN。B和D也是字符串,如果這很重要 –

+0

如果dtypes不相同,那麼列dtype變得混合並將顯示爲'object',儘管預計這會在您與數字和字符串值進行比較時出現問題,並且你的輸出顯示的東西看起來像數字/字符串,但實際上是其他東西,最好有同質的dtypes,以避免這種混淆 – EdChum

+0

說我認爲在這種情況下,它應該不重要,因爲你不合並價值本身,只要鍵列dtypes同意,則上述內容不適用 – EdChum