pandas concat 生成 nan 值
Posted
技术标签:
【中文标题】pandas concat 生成 nan 值【英文标题】:pandas concat generates nan values 【发布时间】:2017-03-13 09:37:06 【问题描述】:我很好奇为什么在 pandas 中简单地串联两个数据框:
shape: (66441, 1)
dtypes: prediction int64
dtype: object
isnull().sum(): prediction 0
dtype: int64
shape: (66441, 1)
CUSTOMER_ID int64
dtype: object
isnull().sum() CUSTOMER_ID 0
dtype: int64
形状相同且都没有 NaN 值
foo = pd.concat([initId, ypred], join='outer', axis=1)
print(foo.shape)
print(foo.isnull().sum())
如果加入会产生很多 NaN 值。
(83384, 2)
CUSTOMER_ID 16943
prediction 16943
如何解决此问题并防止引入 NaN 值?
试着像复制它一样
aaa = pd.DataFrame([0,1,0,1,0,0], columns=['prediction'])
print(aaa)
bbb = pd.DataFrame([0,0,1,0,1,1], columns=['groundTruth'])
print(bbb)
pd.concat([aaa, bbb], axis=1)
失败,例如工作得很好,因为没有引入 NaN 值。
【问题讨论】:
【参考方案1】:我认为不同的索引值有问题,所以concat
无法对齐的地方得到NaN
:
aaa = pd.DataFrame([0,1,0,1,0,0], columns=['prediction'], index=[4,5,8,7,10,12])
print(aaa)
prediction
4 0
5 1
8 0
7 1
10 0
12 0
bbb = pd.DataFrame([0,0,1,0,1,1], columns=['groundTruth'])
print(bbb)
groundTruth
0 0
1 0
2 1
3 0
4 1
5 1
print (pd.concat([aaa, bbb], axis=1))
prediction groundTruth
0 NaN 0.0
1 NaN 0.0
2 NaN 1.0
3 NaN 0.0
4 0.0 1.0
5 1.0 1.0
7 1.0 NaN
8 0.0 NaN
10 0.0 NaN
12 0.0 NaN
如果不需要索引值,解决方案是reset_index
:
aaa.reset_index(drop=True, inplace=True)
bbb.reset_index(drop=True, inplace=True)
print(aaa)
prediction
0 0
1 1
2 0
3 1
4 0
5 0
print(bbb)
groundTruth
0 0
1 0
2 1
3 0
4 1
5 1
print (pd.concat([aaa, bbb], axis=1))
prediction groundTruth
0 0 0
1 1 0
2 0 1
3 1 0
4 0 1
5 0 1
编辑:如果需要像 aaa
这样的相同索引并且 DataFrames 的长度是相同的使用:
bbb.index = aaa.index
print (pd.concat([aaa, bbb], axis=1))
prediction groundTruth
4 0 0
5 1 0
8 0 1
7 1 0
10 0 1
12 0 1
【讨论】:
所以你会建议一个 resetIndex() / ignore_index=True ?因为两者都没有为我解决问题。 嗯,如果重置索引还是同样的问题? 确实,您在上面使用pd.concat([ypred.reset_index(drop=True), initId.reset_index(drop=True)], axis=1)
发表的评论效果很好!非常感谢。
似乎任何行的删除都必须在后面加上reset_index
,以避免在处理过程中出现此类索引问题。
我遇到了同样的问题,即使我尝试简单地添加一列,它也会给我 NaN。 drop & inplace 为我解决了这个问题【参考方案2】:
你可以这样做:
concatenated_dataframes = concat(
[
dataframe_1.reset_index(drop=True),
dataframe_2.reset_index(drop=True),
dataframe_3.reset_index(drop=True)
],
axis=1,
ignore_index=True,
)
concatenated_dataframes_columns = [
list(dataframe_1.columns),
list(dataframe_2.columns),
list(dataframe_3.columns)
]
flatten = lambda nested_lists: [item for sublist in nested_lists for item in sublist]
concatenated_dataframes.columns = flatten(concatenated_dataframes_columns)
连接多个DataFrame
s 并保留列名/避免NaN
。
【讨论】:
以上是关于pandas concat 生成 nan 值的主要内容,如果未能解决你的问题,请参考以下文章