2016-04-26 20 views
1

私は、1にマージしたい2つのデータフレームを持っています。長さは異なりますが、同じ情報がいくつか含まれています。
ここでAは、位置、Bカテゴリ及びCのカウントを指定する最初のデータフレームpandasデータフレームの長さが等しくない場合のマージ

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

あります。
そして、他の

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

ここでAは、再び他のデータフレームと同じ場所です。しかし、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 

「 - 」何もすることができます。好ましくは、「何もない」という文字列。それらが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

OK問題はdf1に233行ありますが、df2には83行しかないので、結果として期待通りに動作すると期待しています。 – EdChum

+0

2つをマージすることができたらデータフレーム。基本的にdf2の欠損値をすべて記入してください。だから、もしdf1がBRONXの47の値を持っていて、df2の値が17しかなければ、df2の残りの30の値に[BRONX、NOTHING、0]を書きます。そして、私は2つのデータフレームをマージすることができます。これは他のボラウザにも適用されます。QUEENS、MANHATTAN、BROOKLYN、STATEN ISLAND –

答えて

2

left LHSの列 'A'、 'B' にタイプmergeと 'A' を実行し、 'D'はあなたのキー列であるので、これらはあなたのキー列です。

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 

EDIT

あなたの質問が変更されていますが、基本的に、ここであなたが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を使用することができます文字列「NaNの」、次のとおりです。

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'と表示されますが、これは数値と文字列の値との比較時に問題を引き起こす可能性があります。あなたの出力は数字/文字列のように見えますが、実際には他のものですが、この混乱を避けるために均質なdtypeを持つ方が良いです – EdChum

+0

この場合、値をマージしていないので、キー列のdtypeが一致する限り、上記は適用されません。 – EdChum

関連する問題