pandas concat 生成 nan 值

2025-02-13 08:36:00
admin
原创
40
摘要:问题描述:我很好奇为什么在熊猫中两个数据框简单地连接起来:initId.shape # (66441, 1) initId.isnull().sum() # 0 ypred.shape # (66441, 1) ypred.isnul...

问题描述:

我很好奇为什么在熊猫中两个数据框简单地连接起来:

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)

连接多个DataFrames 并保留列名称/避免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()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用