Python 熊猫-合并两个数据帧后获得NaN
我有两个数据帧-df和stratnum,我正在尝试合并。两者都有一个匹配的“STRAT”列: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
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