如果条件适用,交换dataframe两列的值(Python 3)

如果条件适用,交换dataframe两列的值(Python 3),python,group-by,nested,average,Python,Group By,Nested,Average,我想计算地址1和地址2相似的所有行的countX平均值,或者计算地址值反转的情况下的countX平均值。也就是说,address1=ad3和address2=ad1与address1=ad1和address2=ad3相似 比如说,, 如果输入为(csv文件): 输出应为: ID COUNTX ADDRESS1 ADDRESS2 AVG_cOUNTX 1 21 ad3 ad1 21.5 3 23

我想计算地址1和地址2相似的所有行的countX平均值,或者计算地址值反转的情况下的countX平均值。也就是说,address1=ad3和address2=ad1与address1=ad1和address2=ad3相似

比如说,, 如果输入为(csv文件):

输出应为:

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
我已尝试做以下工作:

  • 使用嵌套循环,当我发现某行的address1\u=另一行的address2\u和某行的address2\u=另一行的address1\u时,交换列值
  • 按地址1和地址2分组并计算平均值
  • 因为我有大量的数据集(100-300万),所以这需要非常高效(我的代码不是这样)

    我使用的是Python 3.7和pandas包0.22。
    任何反馈都将不胜感激。

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

    首先创建两个附加列,我们称之为
    'ADDRESS\u 1'
    'ADDRESS\u 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
    

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

    订单不重要,非常感谢@thesilkworm
      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