首页 > 解决方案 > pandas - 在具有列条件的数据帧之间交换行

问题描述

我正在尝试将 df1 中的整行(其中 x 列具有特定值)与 df2 中的整行(其中 x 列具有特定值)进行交换。打印 df1 我在这一行得到了 NaN 我尝试交换。对此有合理的解释吗?我可以根据列中的特定值进行这样的交换吗?任何帮助都非常受欢迎。

import pandas as pd

df1 = pd.DataFrame({'x': [1, 2, 3], 'y': [3, 4, 5]})
df2 = pd.DataFrame({'x': [3223, 323212, 13242], 'y': [41233, 54, 5532]})
df1[df1["x"]==1] = df2[df2["x"]==323212]
df1 #contains NaN and not the values from df2[df2["x"]==323212]

标签: pythonpandas

解决方案


pandas具有对齐索引的数据完整性机制,这意味着值正在尝试根据右侧df2[df2["x"]==323212]来自索引 1 的索引位置对齐,因此它试图转到左侧的索引 1。但是左侧没有索引 1,只有索引 0。因此数据被认为是缺失的(其 pandas 表示为NaN)。

产生未索引集合的操作,如valuesto_numpy()可用于打破这种对齐:

df1[df1["x"] == 1] = df2[df2["x"] == 323212].values

df1

        x   y
0  323212  54
1       2   4
2       3   5

这可能会令人困惑,例如:

df1[df1["x"] == 2] = df2[df2["x"] == 323212]

由于索引正确对齐(两个索引都为 1),因此按预期工作:

df1

        x   y
0       1   3
1  323212  54
2       3   5

像这样的东西:

df1[df1['x'].isin([1, 3])] = df2[df2["x"].isin([3223, 323212])]

似乎只部分工作:

df1

        x        y
0  3223.0  41233.0
1     2.0      4.0
2     NaN      NaN

但是,所有情况都是这种索引对齐的结果,将值放置在基于索引的“正确”位置。


推荐阅读