Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换数据帧中很少出现的值_Python_Pandas - Fatal编程技术网

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

Python 替换数据帧中很少出现的值,python,pandas,Python,Pandas,我有一个中等大小(约60000行15列)的csv文件,我正在处理熊猫。每行代表一个人并包含个人数据。我想匿名呈现数据。我想这样做的一种方法是替换特定列中的值,这些值很少。我最初的尝试如下: def clean_data(entry): if df[df.column_name == entry].index.size < 10: return 'RARE_VALUE' else: return entry df.new_column_nam

我有一个中等大小(约60000行15列)的csv文件,我正在处理熊猫。每行代表一个人并包含个人数据。我想匿名呈现数据。我想这样做的一种方法是替换特定列中的值,这些值很少。我最初的尝试如下:

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)
def clean_数据(条目):
如果df[df.column_name==entry].index.size<10:
返回“稀有值”
其他:
返回条目
df.new_column_name=df.column_name.apply(清除数据)

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

我想您需要按列名分组:

g = df.groupby('column_name')
例如,您可以使用筛选器仅返回列名称中出现10次以上的行:

g.filter(lambda x: len(x) >= 10)
要使用“稀有值”覆盖列,您可以使用transform(它为每个组计算一次结果,并将其适当地分布):

df.loc[g[col].transform(lambda x:len(x)<10).astype(bool),col]=“稀有值”
正如DSM所指出的,以下技巧要快得多:

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

df.loc[df[col].value_counts()[df[col]]。value<10,col]=“稀有值”
以下是一些timeit信息(显示DSM的解决方案是多么令人印象深刻!):

[21]中的
g=pd.DataFrame(np.random.randint(1100,(1000,2)).groupby(0)
在[22]中:%timeit g.filter(λx:len(x)>=10)
10个回路,最佳3个:每个回路67.2毫秒
在[23]:%timeit df.loc[g[1].转换(lambda x:len(x)<10).values.astype(bool),1]
10个环路,最佳3个:每个环路44.6毫秒
在[24]中:%timeit df.loc[df[1]。值_counts()[df[1]]。值<10,1]
1000个回路,最佳3个:每个回路1.57毫秒

@Andy Hayden以各种方式解决了这个问题。不过,我建议您在执行此类任务时使用。以下内容可能看起来更加笨拙,但如果您希望将整个管道保存为对象,或者如果您必须对测试集进行一般化预测,则可以使用它:

class RemoveScarceValuesFeatureEngineer:

    def __init__(self, min_occurences):
        self._min_occurences = min_occurences
        self._column_value_counts = {}

    def fit(self, X, y):
        for column in X.columns:
            self._column_value_counts[column] = X[column].value_counts()
        return self

    def transform(self, X):
        for column in X.columns:
            X.loc[self._column_value_counts[column][X[column]].values
                  < self._min_occurences, column] = "RARE_VALUE"

        return X

    def fit_transform(self, X, y):
        self.fit(X, y)
        return self.transform(X)
class RemoveScarceValuesFeatureEngineer:
定义初始事件(自身、最小事件):
self.\u min\u occurrences=min\u occurrences
self.\列\值\计数={}
def配合(自、X、y):
对于X.columns中的列:
self.\u column\u value\u counts[column]=X[column]。value\u counts()
回归自我
def变换(自,X):
对于X.columns中的列:
X.loc[self.\u column\u value\u counts[column][X[column]]值

您可以在此处找到更多信息:

您可以,但这显然会减慢您所做的一切。通常,在应用程序中返回不同类型的数据(这里是字符串或序列)是一个坏主意,不清楚您希望应用程序返回什么…@而且您的评论向我表明,我可能无法正确理解
apply
。我的理解是,如果满足条件,我的函数将返回字符串'ra稀_VALUE',如果不满足条件,则保留现有字符串/null。这不对吗?啊,等等,我明白你的意思了,我把它错当成了数据帧应用。不,你是对的,但是每一步的布尔掩蔽都很慢
df.loc[df[col].value_counts()[df[col]]。value<10,col]=“稀有值”
可能会快一点。@DSM这是一种适当的巫术。。。那当然不是更快!要不要在上面加上四行字?@AndyHayden,它给了我一个列名列表,然后
不在索引中
@DSM您的变体为我提供了一个列中的值列表,然后
不在索引中
(在我完成了一个填充之后,因为最初不会使用NA进行索引)@AndyHayden:你这样做有什么原因吗
.groupby(0)
然后
g[1]
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
class RemoveScarceValuesFeatureEngineer:

    def __init__(self, min_occurences):
        self._min_occurences = min_occurences
        self._column_value_counts = {}

    def fit(self, X, y):
        for column in X.columns:
            self._column_value_counts[column] = X[column].value_counts()
        return self

    def transform(self, X):
        for column in X.columns:
            X.loc[self._column_value_counts[column][X[column]].values
                  < self._min_occurences, column] = "RARE_VALUE"

        return X

    def fit_transform(self, X, y):
        self.fit(X, y)
        return self.transform(X)