python - 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]
解决方案
pandas
具有对齐索引的数据完整性机制,这意味着值正在尝试根据右侧df2[df2["x"]==323212]
来自索引 1 的索引位置对齐,因此它试图转到左侧的索引 1。但是左侧没有索引 1,只有索引 0。因此数据被认为是缺失的(其 pandas 表示为NaN
)。
产生未索引集合的操作,如values
或to_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
但是,所有情况都是这种索引对齐的结果,将值放置在基于索引的“正确”位置。
推荐阅读
- c++ - 使用 VirtualAlloc 时,为什么我至少只能分配 1000 个字节?
- html - 如何根据浏览器宽度在 div 的静态空间和左/右空间之间留出空间?
- azure - 使用管道任务将文件复制到 azure linux vm
- java - 我如何在java中用这个锯齿状数组制作这个例子
- php - 雄辩模型的 Laravel 通知
- java - 从可观察列表中删除项目
- android - 从不同的 Activity 打开 RecycleAdapter 中的特定卡片项目
- python - 从 Python 中的文本文件中提取特定字符串
- java - 使用 Java 删除后,从 GCS 存储桶下载文件的 URL 仍可访问
- initialization - 如何决定使用哪种模式进行“kaiming_normal”初始化