python - 有没有办法在 python 中并排排序 2 个数据帧并将那些不在两者中的数据帧移动到底部
问题描述
我在日常工作中使用 python 来自动化一些日常工作。我正在寻求一些帮助,以了解如何将 2 个数据帧并排排序并将那些不在两者中的值移动到起源的数据帧的底部。
例如,在下面的两个数据帧中,一旦到达 WWT0117(左手 df),就会有 0.03 的少量剩余量。WWT0117 不在右侧的数据框中,所以我想将此 WWT0117 和相应的 0.03 值移动到数据框的底部。
下面是两个数据框并排的视图,突出显示的是倾斜的地方。数据框要大得多,逐行遍历很乏味。
解决方案
如果此答案与您想要的不符,请说明您想要什么。就目前而言,您的问题有一些解释空间。
第一种方法:名字加入
df1 = pd.DataFrame({'name1':['WWT0034', 'WWT0039', 'WWT0117', 'WWT0119'], 'v1':[-80832.72, 3949.78,0.03,-0.05]})
df2 = pd.DataFrame({'name2':['WWT0034', 'WWT0039', 'WWT0140', 'WWT0180'], 'v2':[80832.72, -3949.78,344.46,83464.11]})
# df1 df2
# name1 v1 name2 v2
# 0 WWT0034 -80832.72 0 WWT0034 80832.72
# 1 WWT0039 3949.78 1 WWT0039 -3949.78
# 2 WWT0117 0.03 2 WWT0140 344.46
# 3 WWT0119 -0.05 3 WWT0180 83464.11
df = df1.set_index('name1').join(df2.set_index('name2'), how='outer')
# df
# v1 v2
# WWT0034 -80832.72 80832.72
# WWT0039 3949.78 -3949.78
# WWT0117 0.03 NaN
# WWT0119 -0.05 NaN
# WWT0140 NaN 344.46
# WWT0180 NaN 83464.11
(df['v1'] + df['v2']) == 0
# WWT0034 True
# WWT0039 True
# WWT0117 False
# WWT0119 False
# WWT0140 False
# WWT0180 False
df[(df['v1'] + df['v2']) == 0]
# v1 v2
# WWT0034 -80832.72 80832.72
# WWT0039 3949.78 -3949.78
方法二:排序后按行号加入
或者:
>>> df = df1.sort_values(by='name1').reset_index(drop=True).join(df2.sort_values(by='name2').reset_index(drop=True))
>>> df
name1 v1 name2 v2
0 WWT0034 -80832.72 WWT0034 80832.72
1 WWT0039 3949.78 WWT0039 -3949.78
2 WWT0117 0.03 WWT0140 344.46
3 WWT0119 -0.05 WWT0180 83464.11
>>> df[(df['v1'] + df['v2']) == 0]
name1 v1 name2 v2
0 WWT0034 -80832.72 WWT0034 80832.72
1 WWT0039 3949.78 WWT0039 -3949.78
>>> df[(df['v1'] + df['v2']) != 0]
name1 v1 name2 v2
2 WWT0117 0.03 WWT0140 344.46
3 WWT0119 -0.05 WWT0180 83464.11
两种方法的区别
请注意,这两种方法并不等效。第一种方法基于'name1'
和'name2'
列连接两个数据框;第二种方法忽略名称并在排序后根据行号将它们连接起来。
这是两个数据框的示例,它们使用两种不同的方法会给出不同的结果:
df1 = pd.DataFrame({'name1':['WWT0034', 'WWT0039', 'WWT0117', 'WWT0119', 'WWT0120'], 'v1':[-80832.72, 3949.78,0.03,-0.05, 42]})
df2 = pd.DataFrame({'name2':['WWT0034', 'WWT0039', 'WWT0118', 'WWT0120', 'WWT0180'], 'v2':[80832.72, -3949.78,344.46,-42, 83464.11]})
# df1 df2
# name1 v1 name2 v2
# 0 WWT0034 -80832.72 0 WWT0034 80832.72
# 1 WWT0039 3949.78 1 WWT0039 -3949.78
# 2 WWT0117 0.03 2 WWT0118 344.46
# 3 WWT0119 -0.05 3 WWT0120 -42.00
# 4 WWT0120 42.00 4 WWT0180 83464.11
第一种方法将两者'WWT0120'
结合在一起,而第二种方法将它们分开。
推荐阅读
- python - Winerror 2 系统找不到指定的字段
- ios - SwiftUI 2.0 键盘避免设置滚动条偏移
- django - 插入新记录时,Django Haystack 无法更新索引
- linux - 列出 GCP GAE Linux 中的所有 RSYNCed 文件夹
- python - 使用 Python 填充 MS Access 表单
- javascript - 我正在尝试使用 discord js 在 discord 服务器上创建一个新类别,但它不起作用
- http - 关于内部 API 设计的意见 - 状态码
- spring - 在哪里为项目实施小型项目特定的注释处理任务
- mysql - 我如何使用 mysql 查询来获取一个实体和多个与之相关的实体?
- prometheus - Prometheus 获取每个桶的最大值