首页 > 解决方案 > 有没有办法在 python 中并排排序 2 个数据帧并将那些不在两者中的数据帧移动到底部

问题描述

我在日常工作中使用 python 来自动化一些日常工作。我正在寻求一些帮助,以了解如何将 2 个数据帧并排排序并将那些不在两者中的值移动到起源的数据帧的底部。

例如,在下面的两个数据帧中,一旦到达 WWT0117(左手 df),就会有 0.03 的少量剩余量。WWT0117 不在右侧的数据框中,所以我想将此 WWT0117 和相应的 0.03 值移动到数据框的底部。

下面是两个数据框并排的视图,突出显示的是倾斜的地方。数据框要大得多,逐行遍历很乏味。

在此处输入图像描述

标签: pythonpandasdataframesorting

解决方案


如果此答案与您想要的不符,请说明您想要什么。就目前而言,您的问题有一些解释空间。

第一种方法:名字加入

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'结合在一起,而第二种方法将它们分开。


推荐阅读