首页 > 解决方案 > 如果条件适用,交换两列数据框的值(Python 3)

问题描述

我想计算所有具有相似 address1 和 address2 的行或地址值反转的情况的 countX 平均值。即,address1=ad3 和address2=ad1 类似于address1=ad1 和address2=ad3。

例如,如果输入是(csv 文件):

ID    COUNTX     ADDRESS1     ADDRESS2  
1        21       ad3       ad1
2        22       ad1       ad3
3        23       ad2       ad4
4        25       ad2       ad4
5        25       ad1       ad5
6        23       ad5       ad1
7        22       ad1       ad4
8        21       ad4       ad6  

输出应该是:

ID    COUNTX     ADDRESS1     ADDRESS2     AVG_cOUNTX   
1        21       ad3       ad1       21.5
3        23       ad2       ad4       24
5        25       ad1       ad5       24
7        22       ad1       ad4       22
8        21       ad4       ad6       21

我试图做以下事情:

  1. 当我发现 address1_of_a_row =address2_another_row 和 address2_of_a_row=address1_another_row 时,使用嵌套循环交换列值
  2. 按地址1和地址2分组并计算AVG。

由于我有大型数据集(1-3 百万),这需要非常有效(我的代码不是这种情况)。

我正在使用 Python 3.7 和 pandas 包 0.22。对于任何反馈,我们都表示感谢。

标签: pythongroup-bynestedaverage

解决方案


这是一种方法。可能还有其他更优雅的解决方案,但这应该可以完成工作,并且比嵌套循环更有效。

首先创建两个额外的列,我们将其称为'ADDRESS_1''ADDRESS_2'。前者将始终包含按字典顺序首先出现的地址,然后您可以根据需要在这些新列上对数据进行分组,因为您不再需要担心地址反转被单独处理的情况。

df['ADDRESS_1'] = df[['ADDRESS1', 'ADDRESS2']].values.min(axis=1)
df['ADDRESS_2'] = df[['ADDRESS1', 'ADDRESS2']].values.max(axis=1)

然后使用groupby

grouped = df.groupby(['ADDRESS_1', 'ADDRESS_2']).mean()[['COUNTX']].reset_index()

结果:

  ADDRESS_1 ADDRESS_2  COUNTX
0       ad1       ad3    21.5
1       ad1       ad4    22.0
2       ad1       ad5    24.0
3       ad2       ad4    24.0
4       ad4       ad6    21.0

这与您的示例输出不同,因为地址的顺序丢失了,但是根据您对问题的描述,我认为这并不重要。如果不是这样,请在下面评论。


推荐阅读