Python 合并长度不等的数据帧

Python 合并长度不等的数据帧,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有两个数据帧,我想合并成一个。它们的长度不等,但包含一些相同的信息 以下是第一个数据帧: 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

我有两个数据帧,我想合并成一个。它们的长度不等,但包含一些相同的信息

以下是第一个数据帧:

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
此处
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值,我想这只是用字符串替换它们的问题

编辑
输出:


INT64索引:233个条目,0到232
数据列(共3列):
自治区233非空对象
促成因素车辆1233非空对象
RCOUNT 233非空int64
数据类型:int64(1),对象(2)
内存使用率:7.3+KB
没有一个
INT64索引:83个条目,从0到82
数据列(共3列):
自治区83非空对象
车辆类型代码1 83非空对象
VCOUNT 83非空int64
数据类型:int64(1),对象(2)
内存使用率:2.6+KB
没有一个

在列“a”和列“B”上执行
键入,因为列“a”和列“B”是左侧的,列“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
编辑

您的问题已更改,但基本上您可以在此处先使用
combine\u

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
您看到的'CAUSE'的
NaN
是字符串'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

pd.merge(df_One,df_Two,left_on=['A','B'],right_on=['A','D'])你能试试这个吗?好的,我看到你的问题了,df1有233行,但df2只有83行,所以由于长度不相等,你会得到空值,你期待什么,因为我期待这是预期的操作我希望我能合并两个数据帧。基本上填充df2中所有缺失的值。因此,如果df1有47个BRONX值,而df2只有17个,我会用[BRONX,NOTHING,0]填充df2中剩余的30个值。然后我就可以合并这两个数据帧了。这同样适用于其他自治区、皇后区、曼哈顿、布鲁克林和斯塔顿岛,因为在df2中,您有多个自治区条目,所以不清楚应该匹配哪个条目,所以如果您选择了
df1.merge(df2,how='left)
这将生成一个包含3869行的df,因此您必须清理数据或决定加入/合并的其他条件。这与熊猫无关。这是一个数据问题。那么,使用两个独立的数据帧可能会更容易。感谢您抽出时间思考A是否真的包含字符串有关系?因为我的D和E都被设置为NaN。B和D也是字符串如果数据类型不同,则列数据类型会混合显示为
对象
,尽管这是预期的,但在与数值和字符串值进行比较时可能会出现问题,并且输出显示的内容看起来像数值/字符串,但实际上是其他内容,最好使用同质的数据类型,以避免这种混淆。我认为在这种情况下,这不重要,因为您没有合并这样的值,只要键列数据类型一致,那么上面的数据类型就不应该同时适用于A、B、D都是字符串。C和E是整数。我想这就是造成问题的原因吧?不知道为什么它不起作用,当您缺少值时,它会将数据类型转换为float以表示
NaN
这是预期的行为,因为
NaN
不能在
int
中表示,您可以调用
fillna
填充缺少的值,然后使用
astype(int)强制转换数据类型
在这些列上
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