csv Pandas dataframe:根据条件替换按索引寻址的列的值

jogvjijk  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(82)

我只需要根据某些条件替换某些列中的值(未命名,因为我有一个没有头的csv)。特别是,我需要将""替换为\N。例如,假设我需要更改第8列和第9列,即csv的下一行:
964,64448,Alen,,2,1998,A45,,,,(Italy),e02d7543d85d91a772dc9f1cac542751
应变为:
964,64448,Alen,,2,1998,A45,\N,\N,,(Italy),e02d7543d85d91a772dc9f1cac542751
我不能用SED做这个,我必须使用python
我正在加载csv:

df = pd.read_csv(filename, quotechar='"', escapechar="\\", dtype=str, header=None)

并且,假设columns是我必须更改的列的索引列表,我将执行以下操作:

columns = [8, 9]
df.iloc[:, columns] = np.where(
    df.iloc[:, columns] == "", "\\N", df.iloc[:, columns]
)
df.to_csv(...)

这种方法不会抛出任何错误,但根本不起作用,并且不会在输出文件中更改任何内容。我想是因为iloc返回的是一个视图而不是df的副本,但不确定。我尝试了df.iloc[:, columns].replace("", "\\N", inplace=True),但结果是一样的,可能是因为操作必须在同一个df.iloc[...]对象上完成。
我该怎么做?

pod7payv

pod7payv1#

Pandas阅读你的csv,好像它有一个头,但没有数据。您至少需要将header设置为None:

df = pd.read_csv('data', header=None, dtype=str)

然后你可以用它们的索引/默认名称(从0开始)替换列,并写出输出:

df[7].fillna('\\N', inplace=True)
df[8].fillna('\\N', inplace=True)

# Get rid of any other 'NaN' as they were read in blank
df.fillna('')

# Write the output, also stripping the header:
df.to_csv('out', header=None)
# Output:
# 0,964,64448,Alen,,2,1998,A45,\N,\N,,(Italy),e02d7543d85d91a772dc9f1cac542751

这里的概念相同,但现在不会将NaN注入空白位置:

df = pd.read_csv('data', header=None, keep_default_na=False)

df[7].replace('', '\\N', inplace=True)
df[8].replace('', '\\N', inplace=True)

df.to_csv('out', header=None)
gdrx4gfi

gdrx4gfi2#

您可以在阅读文件后使用fillna

df = pd.read_csv(filename, quotechar='"', escapechar="\\", dtype=str, header=None)

df = df.fillna({7: r'\N', 8: r'\N'}).fillna('')
df.to_csv('output.csv', index=False, header=False)

输出:

964,64448,Alen,,2,1998,A45,\N,\N,,(Italy),e02d7543d85d91a772dc9f1cac542751

相关问题