Python 熊猫-合并两个数据帧后获得NaN

Python 熊猫-合并两个数据帧后获得NaN,python,pandas,merge,Python,Pandas,Merge,我有两个数据帧-df和stratnum,我正在尝试合并。两者都有一个匹配的“STRAT”列: df.dtypes Out[51]: index float64 BHID category FROM float64 TO float64 FE float64 SIO2 float64 S float64 HEM_R float64 QTZ_R float64 PYR_R float64 STR

我有两个数据帧-dfstratnum,我正在尝试合并。两者都有一个匹配的“STRAT”列:

df.dtypes
Out[51]: 
index     float64
BHID     category
FROM      float64
TO        float64
FE        float64
SIO2      float64
S         float64
HEM_R     float64
QTZ_R     float64
PYR_R     float64
STRAT    category
WEATH     float64
dtype: object

stratnum.dtypes
Out[52]: 
STRAT       category
stratnum       int32
dtype: object
我尝试合并这两个数据帧,但得到了大量的NAN。首先,我认为数据类型是一个问题——在两个数据帧中,STRAT都是
object
dtype,而
stratnum
也是

因此,我将“STRAT”转换为
category
,将stratnum转换为
int
。不过,如果我跑步:

df2 = pd.merge(df, stratnum, how='left', on='STRAT').reset_index()

df2.head(5)
Out[53]: 
   level_0  index     BHID  FROM    TO    FE   SIO2      S      HEM_R  \
0        0    1.0  EMS0417   0.0   2.0  32.7  39.62  0.019  30.169856   
1        1    2.0  EMS0417   2.0   4.0  34.9  38.16  0.021  34.454128   
2        2    3.0  EMS0417   4.0   6.0  38.7  32.92  0.023  37.480192   
3        3    4.0  EMS0417   6.0   8.0  42.4  28.77  0.011  43.541773   
4        4    5.0  EMS0417   8.0  10.0  47.8  21.84  0.015  55.299471   

       QTZ_R     PYR_R STRAT  WEATH  stratnum  
0  32.160097  0.035545   TD3    0.0       NaN  
1  31.218645  0.039287   TD3    0.0       NaN  
2  25.931527  0.043029   TD3    0.0       NaN  
3  22.559341  0.020579   TD3    0.0       NaN  
4  15.487928  0.028062   TD3    0.0       NaN  
我在stratnum列中得到了一大堆NaN,而在原始的
stratnum
dataframe中,一切都很好:

tratnum.head(5)
Out[54]: 
  STRAT  stratnum
0   D1       5610
1   D2       5620
2   D3       5630
3   D4       5640
4   WL       5710
我做错了什么

编辑:我的数据似乎有问题。如果我尝试为“TD3”筛选stratnum数据帧,例如:

test = stratnum[['STRAT']=='TD3']
...
KeyError: False

同时,如果我只查看数据帧,它就在那里(#71):

这可能是因为我从excel电子表格中获取数据,并且它有一些奇怪的编码

EDIT2:将原始excel电子表格的编码更改为UTF-8,但仍然不起作用。

修复了它! 这很奇怪。我确实指定希望excel文件以utf-8编码保存,但当我尝试将其导出到csv时,生成的文件有一大堆ÿ字符。例如,我试图找到的TD3看起来像ÿTD3ÿ


我很快使用“查找和替换”删除了所有特殊字符,保存了csv,现在按预期合并了作品

也许是因为int32?在合并之前尝试将其更改为int64。刚刚尝试过。不幸的是没有帮助。如果对内部连接使用
df2=pd.merge(df,stratnum,how='inner',on='STRAT')
,它会工作吗?至少有一个匹配的值?没有,'internal'返回一个完全空的DataFrame我做了更多的检查,数据出现了一些奇怪的情况,请参阅原始文章的编辑部分。
stratnum

Out[74]: 
     STRAT  stratnum
0      D1       5610
1      D2       5620
2      D3       5630
3      D4       5640
...
69    TD1       8110
70    TD2       8120
71    TD3       8130
72     UN       9999
73      W       5700