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

2024-09-29 19:03:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算所有具有相似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\u of a\u row=address2\u another\u row和address2\u of a\u row=address1\u another\u row时交换列值
  2. 按地址1和地址2分组并计算平均值

因为我有大量的数据集(1-3百万),所以这需要非常高效(我的代码不是这样)。你知道吗

我使用的是python3.7和pandas包0.22。 任何反馈都将不胜感激。你知道吗


Tags: id地址row平均值ad6address1address2ad1
1条回答
网友
1楼 · 发布于 2024-09-29 19:03:57

这里有一条路。可能还有其他更优雅的解决方案,但这应该可以完成这项工作,而且比嵌套循环效率要高得多。你知道吗

首先创建两个额外的列,我们称之为'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

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

相关问题 更多 >

    热门问题