raise KeyError(key) from err KeyError: 'right_only' / 'both'
raise KeyError(key) from err KeyError: 'right_only' / 'both'
我尝试开发 python 比较器。我对名为 compare_type
的变量有疑问,我想将其设置为 l-left join / r - right join / b - inner join (both)
如果我设置 compare_type = 'l';
一切正常
然而,当我执行 compare_type = 'r';
或 compare_type = 'b';
10 时,出现以下错误:
raise KeyError(key) from err
KeyError: 'both'
或
raise KeyError(key) from err
KeyError: 'right_only'
我做错了什么?
完整代码:
import pandas as pd
col_to_compare = 0;
compare_type = 'r'; #l-left join / r - right join / b - inner join (both)
file1_df = pd.read_csv('filename1.csv', usecols=[col_to_compare], names=[col_to_compare])
file2_df = pd.read_csv('filename2.csv', usecols=[col_to_compare], names=[col_to_compare])
file1_df[col_to_compare] = file1_df[col_to_compare].str.upper()
file2_df[col_to_compare] = file2_df[col_to_compare].str.upper()
comparison_result = pd.merge(file1_df, file2_df, on=col_to_compare,
how='left' if (compare_type == 'l') else 'right' if (compare_type == 'r') else 'inner',
indicator=True)
comparison_result = comparison_result.loc[comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both']
print(comparison_result)
comparison_result.to_csv('result.csv')
完整回溯:
C:\Users\john\PycharmProjects\L1\venv\Scripts\python.exe C:/Users/john/PycharmProjects/L1/CsvComparer/csv_comparer.py
Traceback (most recent call last):
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexes\base.py", line 3361, in get_loc
return self._engine.get_loc(casted_key)
File "pandas\_libs\index.pyx", line 76, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index_class_helper.pxi", line 105, in pandas._libs.index.Int64Engine._check_type
File "pandas\_libs\index_class_helper.pxi", line 105, in pandas._libs.index.Int64Engine._check_type
KeyError: 'right_only'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:/Users/john/PycharmProjects/L1/CsvComparer/csv_comparer.py", line 29, in <module>
comparison_result = comparison_result.loc[comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both']
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 931, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 1164, in _getitem_axis
return self._get_label(key, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 1113, in _get_label
return self.obj.xs(label, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\generic.py", line 3776, in xs
loc = index.get_loc(key)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexes\base.py", line 3363, in get_loc
raise KeyError(key) from err
KeyError: 'right_only'
Process finished with exit code 1
这只是链式不等式和 if 运算符中的一个问题。
comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both'
按以下顺序计算:
(
(comparison_result['_merge'] == 'left_only')
if (compare_type == 'l')
else ('right_only' if (compare_type == 'r') else 'both')
)
当 compare_type
为 'r'
时,if 语句导致整个条件结果为:
comparison_result.loc['right_only']
这就是您遇到 KeyError 的原因。
使用括号阐明您想要的操作顺序,或者更好的是,定义一个更易读的变量。在这种情况下:
if (compare_type == 'l'):
target_val = 'left_only'
elif (compare_type == 'r'):
target_val = 'right_only'
else:
target_val = 'both'
comparison_result = comparison_result.loc[comparison_result['_merge'] == target_val]
您对以下行有疑问:
comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both'
我的工作代码:
import pandas as pd
col_to_compare = '0';
compare_type = 'r'; #l-left join / r - right join / b - inner join (both)
# file1_df = pd.read_csv('filename1.csv', usecols=[col_to_compare], names=[col_to_compare])
# file2_df = pd.read_csv('filename2.csv', usecols=[col_to_compare], names=[col_to_compare])
file1_df = pd.DataFrame(
{
"0": ["K0", "K1", "K2", "K3"],
"1": ["A0", "A1", "A2", "A3"],
"2": ["B0", "B1", "B2", "B3"],
}
)
file2_df = pd.DataFrame(
{
"0": ["K1", "K2", "K3", "K4"],
"3": ["C0", "C1", "C2", "C3"],
"4": ["D0", "D1", "D2", "D3"],
}
)
file1_df[col_to_compare] = file1_df[col_to_compare].str.upper()
file2_df[col_to_compare] = file2_df[col_to_compare].str.upper()
comparison_result = pd.merge(file1_df, file2_df, on = col_to_compare, how = ('left' if (compare_type == 'l') else 'right' if (compare_type == 'r') else 'inner'), indicator = True)
print(f'{comparison_result}\n')
comparison_result = comparison_result.loc[comparison_result['_merge'] == ('left_only' if (compare_type == 'l') else ('right_only' if (compare_type == 'r') else 'both'))]
print(f'{comparison_result}')
# comparison_result.to_csv('result.csv')
compare_type = 'r'
的输出:
compare_type = 'l'
的输出:
compare_type = 'b'
的输出:
备注:
I made some minor changes to debug the issue so you can avoid those.
Avoid condition string rendering in DataFrame
我尝试开发 python 比较器。我对名为 compare_type
的变量有疑问,我想将其设置为 l-left join / r - right join / b - inner join (both)
如果我设置 compare_type = 'l';
一切正常
然而,当我执行 compare_type = 'r';
或 compare_type = 'b';
10 时,出现以下错误:
raise KeyError(key) from err
KeyError: 'both'
或
raise KeyError(key) from err
KeyError: 'right_only'
我做错了什么?
完整代码:
import pandas as pd
col_to_compare = 0;
compare_type = 'r'; #l-left join / r - right join / b - inner join (both)
file1_df = pd.read_csv('filename1.csv', usecols=[col_to_compare], names=[col_to_compare])
file2_df = pd.read_csv('filename2.csv', usecols=[col_to_compare], names=[col_to_compare])
file1_df[col_to_compare] = file1_df[col_to_compare].str.upper()
file2_df[col_to_compare] = file2_df[col_to_compare].str.upper()
comparison_result = pd.merge(file1_df, file2_df, on=col_to_compare,
how='left' if (compare_type == 'l') else 'right' if (compare_type == 'r') else 'inner',
indicator=True)
comparison_result = comparison_result.loc[comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both']
print(comparison_result)
comparison_result.to_csv('result.csv')
完整回溯:
C:\Users\john\PycharmProjects\L1\venv\Scripts\python.exe C:/Users/john/PycharmProjects/L1/CsvComparer/csv_comparer.py
Traceback (most recent call last):
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexes\base.py", line 3361, in get_loc
return self._engine.get_loc(casted_key)
File "pandas\_libs\index.pyx", line 76, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index_class_helper.pxi", line 105, in pandas._libs.index.Int64Engine._check_type
File "pandas\_libs\index_class_helper.pxi", line 105, in pandas._libs.index.Int64Engine._check_type
KeyError: 'right_only'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:/Users/john/PycharmProjects/L1/CsvComparer/csv_comparer.py", line 29, in <module>
comparison_result = comparison_result.loc[comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both']
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 931, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 1164, in _getitem_axis
return self._get_label(key, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexing.py", line 1113, in _get_label
return self.obj.xs(label, axis=axis)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\generic.py", line 3776, in xs
loc = index.get_loc(key)
File "C:\Users\john\PycharmProjects\L1\venv\lib\site-packages\pandas\core\indexes\base.py", line 3363, in get_loc
raise KeyError(key) from err
KeyError: 'right_only'
Process finished with exit code 1
这只是链式不等式和 if 运算符中的一个问题。
comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both'
按以下顺序计算:
(
(comparison_result['_merge'] == 'left_only')
if (compare_type == 'l')
else ('right_only' if (compare_type == 'r') else 'both')
)
当 compare_type
为 'r'
时,if 语句导致整个条件结果为:
comparison_result.loc['right_only']
这就是您遇到 KeyError 的原因。
使用括号阐明您想要的操作顺序,或者更好的是,定义一个更易读的变量。在这种情况下:
if (compare_type == 'l'):
target_val = 'left_only'
elif (compare_type == 'r'):
target_val = 'right_only'
else:
target_val = 'both'
comparison_result = comparison_result.loc[comparison_result['_merge'] == target_val]
您对以下行有疑问:
comparison_result['_merge'] == 'left_only' if (compare_type == 'l') else 'right_only' if (compare_type == 'r') else 'both'
我的工作代码:
import pandas as pd
col_to_compare = '0';
compare_type = 'r'; #l-left join / r - right join / b - inner join (both)
# file1_df = pd.read_csv('filename1.csv', usecols=[col_to_compare], names=[col_to_compare])
# file2_df = pd.read_csv('filename2.csv', usecols=[col_to_compare], names=[col_to_compare])
file1_df = pd.DataFrame(
{
"0": ["K0", "K1", "K2", "K3"],
"1": ["A0", "A1", "A2", "A3"],
"2": ["B0", "B1", "B2", "B3"],
}
)
file2_df = pd.DataFrame(
{
"0": ["K1", "K2", "K3", "K4"],
"3": ["C0", "C1", "C2", "C3"],
"4": ["D0", "D1", "D2", "D3"],
}
)
file1_df[col_to_compare] = file1_df[col_to_compare].str.upper()
file2_df[col_to_compare] = file2_df[col_to_compare].str.upper()
comparison_result = pd.merge(file1_df, file2_df, on = col_to_compare, how = ('left' if (compare_type == 'l') else 'right' if (compare_type == 'r') else 'inner'), indicator = True)
print(f'{comparison_result}\n')
comparison_result = comparison_result.loc[comparison_result['_merge'] == ('left_only' if (compare_type == 'l') else ('right_only' if (compare_type == 'r') else 'both'))]
print(f'{comparison_result}')
# comparison_result.to_csv('result.csv')
compare_type = 'r'
的输出:
compare_type = 'l'
的输出:
compare_type = 'b'
的输出:
备注:
I made some minor changes to debug the issue so you can avoid those.
Avoid condition string rendering in DataFrame