熊猫处理大型CSV数据

时间:2020-03-11 05:17:40

标签: python pandas dataframe

我正在使用熊猫处理大小至少为8GB的大数据集。

在读取整个集合时遇到了问题,因此我逐块读取文件。

据我了解,对整个文件进行分块将创建许多不同的数据帧。因此,使用我现有的例程,这只会删除该特定数据帧上的重复值,而不会删除整个文件上的重复值。

我需要根据['Unique Keys']列删除整个数据集上的重复项。

我尝试使用pd.concat,但是我也遇到了内存问题,因此我尝试将文件写入csv文件并在其上附加数据帧的所有结果。

运行代码后,文件不会减少太多,因此我认为我的假设是正确的,即当前例程不会基于整个数据集删除所有重复项。

我是Python的新手,所以如果有人可以向我指出正确的方向,那将真的有帮助。

def removeduplicates(filename):
    CHUNK_SIZE = 250000
    df_iterator = pd.read_csv(filename, na_filter=False, chunksize=CHUNK_SIZE,
                                      low_memory=False)
    # new_df = pd.DataFrame()
    for df in df_iterator:
        df = df.dropna(subset=['Unique Keys'])
        df = df.drop_duplicates(subset=['Unique Keys'], keep='first')

        df.to_csv(join(file_path, output_name.replace(' Step-2', '') +
                       ' Step-3.csv'), mode='w', index=False, encoding='utf8')

3 个答案:

答案 0 :(得分:2)

如果您可以在内存中容纳一组唯一键:

def removeduplicates(filename):
    CHUNK_SIZE = 250000
    df_iterator = pd.read_csv(filename, na_filter=False, 
                              chunksize=CHUNK_SIZE,
                              low_memory=False)
    # create a set of (unique) ids
    all_ids = set()

    for df in df_iterator:
        df = df.dropna(subset=['Unique Keys'])
        df = df.drop_duplicates(subset=['Unique Keys'], keep='first')

        # Filter rows with key in all_ids
        df = df.loc[~df['Unique Keys'].isin(all_ids)]

        # Add new keys to the set
        all_ids = all_ids.union(set(df['Unique Keys'].unique()))

答案 1 :(得分:1)

不使用熊猫可能更容易。

class Ball {
private:
        // This is initialized, but not as needed
        sf::Sprite ball;
public:
        Ball() {
                texture.loadFromFile("ball.png");
                // This is a local object, not the same as the class member.
                sf::Sprite ball2(texture);
                // move it
                this->ball=std::move(ball2);
        }
...

答案 2 :(得分:1)

我认为这是应何时使用DaskPyspark的明确示例。两者都允许您读取内存不足的文件。

Dask为例,您可以这样做:

import dask.dataframe as dd

df = dd.read_csv(filename, na_filter=False)

df = df.dropna(subset=["Unique Keys"])
df = df.drop_duplicates(subset=["Unique Keys"])

df.to_csv(filename_out, index=False, encoding="utf8", single_file=True)