python - 如果条件适用,交换两列数据框的值(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
我试图做以下事情:
- 当我发现 address1_of_a_row =address2_another_row 和 address2_of_a_row=address1_another_row 时,使用嵌套循环交换列值
- 按地址1和地址2分组并计算AVG。
由于我有大型数据集(1-3 百万),这需要非常有效(我的代码不是这种情况)。
我正在使用 Python 3.7 和 pandas 包 0.22。对于任何反馈,我们都表示感谢。
解决方案
这是一种方法。可能还有其他更优雅的解决方案,但这应该可以完成工作,并且比嵌套循环更有效。
首先创建两个额外的列,我们将其称为'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
这与您的示例输出不同,因为地址的顺序丢失了,但是根据您对问题的描述,我认为这并不重要。如果不是这样,请在下面评论。
推荐阅读
- c# - 我可以将 mdb vue (Material Design Vue) 与 Bootstrap Vue 一起使用吗?有哪些风险?
- django - Django 使用 .set 添加多个 m2m 相关模型记录工作正常,但如何添加除 ids 之外的其他模型字段?
- python - 如何通过 django 和请求获得 http 长连接?
- python - 如何通过python使用psutil获取cpu_persent
- android - 谷歌助手与 Android 应用程序的对话
- javascript - 如何使用 redux saga 从 redux 商店获取商品:已解决
- sql - 检查约束-1
- python-requests - 如何将表单数据中的国家/地区代码发布到 URL 以获取预期的 WebData?
- php - 将图像上传到 GoDaddy PHP 表单
- reactjs - 错误:使用 react-hooks 时超出最大更新深度