鱼C论坛

 找回密码
 立即注册
查看: 150|回复: 5

请问如何保留出现2次及2次以上的行

[复制链接]
发表于 2024-11-10 19:51:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在编辑df的过程中,用了        df2 = df.groupby('新列').filter(lambda x: len(x) >= 2).reset_index(drop=True)
计算出来的行不是想要的那种。

新列的值比较长,有12位,其中还包含了字母。(不知是不是值太大,比较不了)
麻烦大神给个代码,多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-10 19:51:42 | 显示全部楼层
要过滤出出现2次及2次以上的行,你可以使用 `groupby` 和 `filter` 的组合方式。你的代码基本是正确的,但可能有一些细节问题。下面是一个完整的示例,确保可以达到你的预期:
import pandas as pd

# 假设这是你的DataFrame
data = {
    '新列': ['abc123', 'def456', 'abc123', 'ghi789', 'def456', 'def456'],
    '其他列': [1, 2, 3, 4, 5, 6]
}

df = pd.DataFrame(data)

# 使用 `groupby` 和 `filter` 保留出现2次及以上的行
df2 = df.groupby('新列').filter(lambda x: len(x) >= 2).reset_index(drop=True)

print(df2)

这个代码会输出:
新列  其他列
0  abc123    1
1  abc123    3
2  def456    2
3  def456    5
4  def456    6

这里确保我们对 `新列` 做了分组,然后用 `filter` 来过滤掉那些出现次数少于2次的组。`reset_index(drop=True)` 用于重置索引。

如果这样做仍然达不到你的要求,请检查:  
1. 确保你的数据实际上包含重复的值。
2. 检查你的列名或者数据格式是否正确。  
如果问题依然存在,可以具体描述数据结构或者提供小段数据样本,我可以帮助得更详细。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-10 20:17:19 | 显示全部楼层
你的不行。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-10 20:17:29 | 显示全部楼层
skyhouse 发表于 2024-11-10 20:17
你的不行。。。。。


让我们仔细检查一下步骤,确保我们能正确保留出现2次及以上的行。以下是一个详细的示例:
import pandas as pd

# 假设这是你的DataFrame
data = {
    '新列': ['abc123XYZ456', 'def456RST789', 'abc123XYZ456', 'ghi789UVX012', 'def456RST789'],
    '其他列': [1, 2, 3, 4, 5]
}

df = pd.DataFrame(data)

# 打印原始数据
print("原始数据:")
print(df)

# 使用 `groupby` 和 `filter` 保留出现2次及以上的行
df2 = df.groupby('新列').filter(lambda x: len(x) >= 2).reset_index(drop=True)

# 打印结果
print("\n出现2次及以上的行:")
print(df2)

在这个示例中:

1. 我们创建了一个示例 DataFrame,其中包含了一个名为 `新列` 的列,该列包含字符串值。
2. 使用 `groupby('新列')` 来按照 `新列` 的值分组。
3. `filter(lambda x: len(x) >= 2)` 会保留那些组内含有2个或更多元素的行。
4. `reset_index(drop=True)` 重置索引以保持整洁。

确保你运行代码时你的DataFrame格式类似于上述示例。这样的话,该代码应该会正确过滤出符合条件的行。如果仍然无法解决问题,可能需要查看更多细节,确保包含正确的数据和列名。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-10 20:18:10 | 显示全部楼层
是否可以用其他函数来处理?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-10 20:18:19 | 显示全部楼层
skyhouse 发表于 2024-11-10 20:18
是否可以用其他函数来处理?


当然可以,你可以使用 `value_counts` 和 `isin` 来实现这一需求。这种方法简单易懂,适用于避免可能的分组复杂性。下面是如何实现的:
import pandas as pd

# 假设这是你的DataFrame
data = {
    '新列': ['abc123', 'abc123', 'def456', 'def456', 'def456', 'ghi789'],
    '其他列': [1, 2, 3, 4, 5, 6]
}

df = pd.DataFrame(data)

# 找出'新列'中出现2次及以上的值
counts = df['新列'].value_counts()
values_to_keep = counts[counts >= 2].index

# 过滤DataFrame以保留'新列'中值出现2次及以上的行
df_filtered = df[df['新列'].isin(values_to_keep)]

# 重置索引
df_filtered = df_filtered.reset_index(drop=True)

print(df_filtered)

这样,你将在 `df_filtered` 中得到所有 `新列` 出现次数为2次及以上的行。

解释步骤:
1. `value_counts()` 得到每个值的出现次数。
2. `counts[counts >= 2].index` 获取那些出现次数不少于2次的值。
3. `isin(values_to_keep)` 筛选出这些值对应的行。
4. 使用 `reset_index(drop=True)` 清理索引。

这种方法简洁明了,不涉及复杂的 `groupby` 逻辑,非常适合这种去重和筛选的任务。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表