2016-04-26 49 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