python - 如果您不关心列名,有没有办法摆脱错误排序的“重复”?
问题描述
假设我有下表。
Α | B1 | B2 |
---|---|---|
1 | 奶牛 | 狗 |
1 | 狗 | 奶牛 |
2 | 猫 | 猪 |
2 | 猫 | 母鸡 |
2 | 母鸡 | 猫 |
2 | 猪 | 猫 |
3 | 奶牛 | 狗 |
3 | 狗 | 奶牛 |
我想说B1和B2在功能上是可以互换的,顺序无所谓。也就是说,前两行是等价的,因为它包含我的 B 列的 'Dog' 和 'Cow' 。结果,我想删除其中一个以消除重复项,基本上如下表所示。
Α | B1 | B2 |
---|---|---|
1 | 奶牛 | 狗 |
2 | 猫 | 猪 |
2 | 猫 | 母鸡 |
3 | 狗 | 奶牛 |
我在这里有点难过,因为我想我会从一个 For 循环开始,但我不确定如何最好地让不同的行相互“交谈”。提前致谢。
解决方案
以下是使用pandas实现此目的的方法(您可以根据您的平台/技术自定义此策略):
首先,基于B1
和创建一个排序和连接的列B2
。由于我们首先排序,因此 Cow、Dog 和 Dog, Cow 现在将变为Cow-Dog
:
df['concat'] = ['-'.join(sorted(tup)) for tup in zip(df['B1'], df['B2'])]
#dropping B1 and B2 because they will mess up the level of data
df_new = df.drop(['B1','B2'], 1)
现在,我们最终会得到重复的行。因此丢弃它们:
pre = df_new.drop_duplicates(subset=['Alpha', 'concat'], keep="first")
任务完成!现在将连接列扩展回原始形状(B1 和 B2)并删除连接列:
pre[['B1','B2']] = pre.concat.str.split("-",expand=True,)
final = pre.drop(['concat'], 1)
Final
数据框将包含您想要的输出!
推荐阅读
- java - 在 Thymeleaf 数组和列表中将整数作为字符串处理
- reactjs - 使用 react-app-wired 服务反应应用程序时出错
- php - 使用下一个按钮 HTML 在 MySQL PHP 中一次滚动一条记录
- python - 在 Jupyter 中使用 @interact 装饰器时实现“重置”按钮
- python - 对元组列表进行排序实际上并没有对它们进行排序
- prometheus - Prometheus WAL 继续无限增长
- c - 我想知道这个 *list 指针在这段代码中是关于什么的
- c - 指针的地址是如何寻址的?
- jquery - 使用本地 geoJSON 文件将其添加到我的 MapBox GL JS API 时出错
- ajax - WordPress 正在以登录用户的身份创建 nonce,但验证不正确