我有以下的Python方法,它接收一个带有两个CSV文件名称的列表,合并它们,并返回一个只有差异的 Dataframe 。通常,此方法工作得很好,但有一种情况下我会收到以下错误消息:
"ValueError: You are trying to merge on float64 and object columns. If you wish to proceed you should use pd.concat"
我希望能够使用Try/Except块捕获此错误,并将Float64列转换为OBJECT数据类型。我可以用下面的代码捕获错误,但我不确定如何将列转换为该数据类型,因为列的名称可能会根据所摄取的CSV文件而改变。有没有人可以帮我解释一下,我如何获得在此try/Except块上抛出错误的列的引用,并将其转换为Object?或者,有没有更优雅的方法来处理这个错误?
def get_difference(list):
try:
df_1 = pd.read_csv(list[0])
print('column types of df_1')
print(df_1.dtypes.to_string())
df_2 = pd.read_csv(list[1])
print('nncolumn types of df_2')
print(df_2.dtypes.to_string())
data_12 = df_1.merge(df_2, indicator=True, how='outer')
data_12_diff = data_12.loc[lambda x: x['_merge'] != 'both']
data_12_diff = data_12_diff.drop(columns=['_merge'])
data_12_diff=data_12_diff.reset_index(drop=True)
return data_12_diff
except ValueError:
print('Value Error Exception. Mismatch of types')
"""
Additional code here!
"""
exit()
提前谢谢!诚挚的问候
1条答案
按热度按时间kqlmhetl1#
克服这一问题的最简单方法是强制每列使用正确的数据类型。如果从程序一开始就确保正确的数据类型,就不太可能出现这样的问题。
话虽如此,我在一段时间前创建了下面的代码,以准确地解决您面临的问题。定义每列正确的数据类型并在需要时转换为它,这并不是100%可靠的,但它可能会解决您的问题:
示例
上面的代码定义了一个名为
safe_merge
的自定义Pandas Dataframe 方法,您可以使用与普通pandas.DataFrame.merge
方法相同的方式(事实上,它使用了实际pandas.DataFrame.merge
源代码的大约80%)。下面是一个它能做什么的例子:
下面是使用普通
pandas.DataFrame.merge
的相同示例: