Pandas drop_duplicates() 在从 csv 文件读取时向 DataFrame 添加一行后不起作用
Pandas drop_duplicates() not working after add a row to DataFrame when read from a csv file
我的代码如下:
indexing_file_path = 'indexing.csv'
if not os.path.exists(indexing_file_path):
df = pd.DataFrame([['1111', '20200101', '20200101'],
['1112', '20200101', '20200101'],
['1113', '20200101', '20200101']],
columns = ['nname', 'nstart', 'nend'])
else:
df = pd.read_csv(indexing_file_path, header = 0)
print(df)
df.loc[len(df)] = ['1113', '20200202', '20200303']
# append() method not working either
print(df)
df.drop_duplicates('nname', keep = 'last', inplace = True)
print(df)
df.to_csv(indexing_file_path, index = False)
我想使 nname
列在此文件中保持唯一。
当代码 运行 第一次时,它会正确地将记录保存到 csv 文件中,尽管 1113
不是唯一的。
当代码 运行 第二次时,它会保存两行 1113
到 csv 文件,因为 DataFrame 是从 csv 文件创建的。
第三次运行后,它会一直保留两1113
行。
现在我有一个解决方案:
1,保存到包含两行 1113
的 csv 文件。
2、再次读取csv文件
3,再次使用drop_duplicates
。
4,再次保存到csv文件。
为什么从 csv 文件创建的 DataFrame 如此不同?
如何一次性将唯一行保存到 csv 文件?
我现在可以回答我的问题了。
原因是:
从 csv 文件创建 DataFrame 时,pandas 将 nname
列识别为整数
但是,当我再次添加 1113
行时,pandas 将新行 nname
识别为字符串,因此整数 1113
不等于字符串 1113
, pandas 将保留两行。
解决方法是:
将 csv 文件读取为字符串。
df = pd.read_csv(indexing_file_path, header=0, dtype=str)
我的代码如下:
indexing_file_path = 'indexing.csv'
if not os.path.exists(indexing_file_path):
df = pd.DataFrame([['1111', '20200101', '20200101'],
['1112', '20200101', '20200101'],
['1113', '20200101', '20200101']],
columns = ['nname', 'nstart', 'nend'])
else:
df = pd.read_csv(indexing_file_path, header = 0)
print(df)
df.loc[len(df)] = ['1113', '20200202', '20200303']
# append() method not working either
print(df)
df.drop_duplicates('nname', keep = 'last', inplace = True)
print(df)
df.to_csv(indexing_file_path, index = False)
我想使 nname
列在此文件中保持唯一。
当代码 运行 第一次时,它会正确地将记录保存到 csv 文件中,尽管 1113
不是唯一的。
当代码 运行 第二次时,它会保存两行 1113
到 csv 文件,因为 DataFrame 是从 csv 文件创建的。
第三次运行后,它会一直保留两1113
行。
现在我有一个解决方案:
1,保存到包含两行 1113
的 csv 文件。
2、再次读取csv文件
3,再次使用drop_duplicates
。
4,再次保存到csv文件。
为什么从 csv 文件创建的 DataFrame 如此不同?
如何一次性将唯一行保存到 csv 文件?
我现在可以回答我的问题了。
原因是:
从 csv 文件创建 DataFrame 时,pandas 将 nname
列识别为整数
但是,当我再次添加 1113
行时,pandas 将新行 nname
识别为字符串,因此整数 1113
不等于字符串 1113
, pandas 将保留两行。
解决方法是:
将 csv 文件读取为字符串。
df = pd.read_csv(indexing_file_path, header=0, dtype=str)