当前位置: 首页 > 知识库问答 >
问题:

替换pandas数据帧中很少出现的值

元俊雅
2023-03-14

我有一个中等大的(大约60,000行乘以15列)csv文件,我正在与Pandas一起工作。每一行代表一个人并包含个人数据。我想以匿名方式呈现数据。我想这样做的一种方法是在某个列中替换它们稀少的值。我最初是这样做的:

def clean_data(entry):
    if df[df.column_name == entry].index.size < 10:
        return 'RARE_VALUE'
    else:
        return entry

df.new_column_name = df.column_name.apply(clean_data)

但每次运行它都冻结了我的系统。不幸的是,这意味着我没有有用的调试数据。有没有人知道这样做的正确方法?该列同时包含字符串和空值。

共有1个答案

时向文
2023-03-14

我认为您想要groupby列名:

g = df.groupby('column_name')

例如,您可以使用筛选器,只返回那些在column_name中有某些内容出现10次以上的行:

g.filter(lambda x: len(x) >= 10)

要用'RARE_VALUE'覆盖列,可以使用transform(它为每个组计算一次结果,并适当地将其分散开来):

df.loc[g[col].transform(lambda x: len(x) < 10).astype(bool), col] = 'RARE_VALUE'

正如DSM所指出的,下面的诀窍要快得多:

df.loc[df[col].value_counts()[df[col]].values < 10, col] = "RARE_VALUE"

以下是一些timeit信息(展示DSM的解决方案是多么令人印象深刻!):

In [21]: g = pd.DataFrame(np.random.randint(1, 100, (1000, 2))).groupby(0)

In [22]: %timeit g.filter(lambda x: len(x) >= 10)
10 loops, best of 3: 67.2 ms per loop

In [23]: %timeit df.loc[g[1].transform(lambda x: len(x) < 10).values.astype(bool), 1]
10 loops, best of 3: 44.6 ms per loop

In [24]: %timeit df.loc[df[1].value_counts()[df[1]].values < 10, 1]
1000 loops, best of 3: 1.57 ms per loop
 类似资料:
  • 我有一个熊猫的数据框架,看起来像这样: 当列名是从15到159的A时,我想替换pr行名的值。我如何使用熊猫在Python中做到这一点?

  • 当我尝试将函数应用于Amount列时,我得到以下错误: 我试过使用Math模块中的.isnan应用函数我试过使用pandas.replace属性我试过使用pandas0.9中的.sparse data属性我也试过使用函数中的if NaN==NaN语句。我还看了这篇文章,如何在R数据帧中用0替换NA值?同时查看一些其他文章。我试过的所有方法都不起作用,或者不认识南。如有任何提示或解决方案,将不胜感激

  • 我有3个数据帧。第一数据帧(例如df1)具有多行和多列。第二和第三数据帧(例如df2和df3)仅具有来自DF1的一行和列的子集。df2和df3中的列名相同。所以我要做的是将df1中的每一行与df2和DF3中的单行进行比较。如果来自df1的单元格的值与df2的单元格内容匹配,则将df1中单元格的值替换为1;如果来自df1的单元格的值与df3匹配,则将df1中单元格的值替换为2;如果df2的单元格内容

  • 问题内容: 我的问题与此非常相似,但是我需要转换整个数据框,而不仅仅是转换一系列数据框。该功能一次只能在一个系列上使用,不能很好地替代不推荐使用的命令。有没有办法获得与新熊猫版本中的命令相似的结果? 谢谢MikeMüller的示例。如果所有值都可以转换为整数,则效果很好。如果在我的数据帧中我有无法转换为整数的字符串怎么办?例: 然后,我可以运行不赞成使用的函数并获取: 运行命令会给我错误,即使尝试

  • 我正在尝试将熊猫DF转换为Spark one。测向头: 代码: 我得到了一个错误:

  • 有没有一种方法可以将下面的两个数据流连接起来,这样: 我将有一个带有标题的新数据帧: 时间戳调整的关闭reportedEPS estimatedEPS 并且reportedEPS和estimatedEPS将根据以下值保持不变: 时间戳:1月1日至3月31日,4月1日至6月30日,7月1日至9月30日,10月1日至12月31日? 2个数据流: https://gyazo.com/38B50A3D7E