我正在使用熊猫处理大小至少为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')
答案 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)
我认为这是应何时使用Dask
或Pyspark
的明确示例。两者都允许您读取内存不足的文件。
以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)