pandas concat 生成 nan 值
- 2025-02-13 08:36:00
- admin 原创
- 40
问题描述:
我很好奇为什么在熊猫中两个数据框简单地连接起来:
initId.shape # (66441, 1)
initId.isnull().sum() # 0
ypred.shape # (66441, 1)
ypred.isnull().sum() # 0
形状相同,且均没有 NaN 值
foo = pd.concat([initId, ypred], join='outer', axis=1)
foo.shape # (83384, 2)
foo.isnull().sum() # 16943
如果连接的话,会产生大量的 NaN 值。
我该如何解决这个问题并防止引入 NaN 值?尝试重现它
aaa = pd.DataFrame([0,1,0,1,0,0], columns=['prediction'])
bbb = pd.DataFrame([0,0,1,0,1,1], columns=['groundTruth'])
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
解决方案 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
。
解决方案 3:
正如jezrael指出的那样,这是由于不同的索引标签造成的。concat
索引上的匹配,因此如果它们不相同,就会出现此问题。对于简单的水平串联,您必须“强制”索引标签相同。一种方法是通过set_axis
方法。这使得第二个数据框索引与第一个数据框的索引相同。
joined_df = pd.concat([df1, df2.set_axis(df1.index)], axis=1)
或者只是重置两个框架的索引
joined_df = pd.concat([df1.reset_index(drop=True), df2.reset_index(drop=True)], axis=1)
解决方案 4:
如果数据框的行数相同,则可以转置原始数据框,然后按行连接以避免索引问题。如果您有大量数据框需要连接,这种方法将非常有用。
dataframes_list = [df1, df2, df3]
dataframes_list_transposed = [list_item.transpose() for list_item in dataframes_list]
merged_dataframe = pd.concat(dataframes_list_transposed, axis=0).transpose()
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD