【发布时间】:2021-10-25 06:40:56
【问题描述】:
在这里Pandas merge on multiple columns ignoring NaN 提出了类似的问题,但没有答案,所以我会问也许有人可以提供帮助。
我需要将df2 中的值合并到df1,但是df2 中的行之间的合并键不同,因为df2 中的行在不同的列中具有NaNs,并且在在这种情况下,我想忽略这些列,并且只对每一行使用具有值的列。
df1 = pd.DataFrame([[0, 1, 3], [0, 2, 4], [1, 2, 5]], columns=['level1', 'level2', 'level3'])
df1
level1 level2 level3
0 0 1 3
1 0 2 4
2 1 2 5
df2 = pd.DataFrame([[0, None, None, 10], [0, 1, None, 12], [None, 2, 5, 13]], columns=['level1', 'level2', 'level3', 'value'])
df2
level1 level2 level3 value
0 0.0 NaN NaN 10
1 0.0 1.0 NaN 12
2 NaN 2.0 5.0 13
当我执行df1.merge(df2, how='left') 时,我在value 列中得到df1 和NaN,因为在所有level 列上都没有匹配项,因为pandas 正在尝试匹配Nan价值观。
我想要的是匹配df2中的任何行而不尝试匹配NaNs:
level1 level2 level3 value
0 0 1 3 10
1 0 1 3 12
2 0 2 4 10
3 1 2 5 13
说明:
df1 中的第 0 行与df2 中第 0 行和第 1 行的非NaN 列匹配,因此它从那里获取值 10 和 12。 df1 中的第 1 行与 df2 中第 0 行的非NaN 列匹配,因此它从那里获得值 12。 df1 中的第 2 行与 df2 中第 2 行的非NaN 列匹配,因此它从那里获得值 13。
在实际数据中,我实际上有 6 个level 列,df2 中每一行的非NaN 列可以是任意组合,也可以是单列。
我现在要做的是iterrowsdf2 中的行,为每个行创建一个仅非NaN 列的迷你dataframe,并将df1 与它合并。但正如我们所知,它的效率并不高,我想知道是否有更好的方法可以做。
【问题讨论】:
-
这可能是
NetworkX问题。话虽如此,我不知道如何快速解决它。
标签: python pandas dataframe merge nan