将 pandas DataFrame 保存并加载到 csv 后出现 ValueError

ValueError after saving and loading pandas DataFrame to csv

我正在尝试根据所有列的值查找 DataFrame 中是否存在一行。我相信我找到了解决方案,但是在保存和加载 DataFrame into/from .csv 文件后我遇到了问题。

在下面的示例中,我遍历 DataFrame 的每一行,并找到对应于每一行的索引——即所有列都与被查询的行相同的行。

注意:在我的真实代码中,我迭代了一个较小的 DataFrame 并在一个较大的 DataFrame 中搜索行。但是这两种情况都会出现这个问题。

import pandas  as pd

df = pd.DataFrame([[1, 2], [3, 4]])         # Create data frame
df.to_csv(my_filename, index=False)         # Save to csv
df1 = pd.read_csv(my_filename)              # Load from csv

# Find original data in loaded data
for row_idx, this_row in df.iterrows():
    print(np.where((df  == this_row).all(axis=1)))    # This returns the correct index

for row_idx, this_row in df.iterrows():
    print(np.where((df1 == this_row).all(axis=1)))    # This returns an empty index, and a FutureWarning

输出为:

(array([0]),)
(array([1]),)
(array([], dtype=int64),)
(array([], dtype=int64),)
tmp.py:25: FutureWarning: Automatic reindexing on DataFrame vs Series comparisons is deprecated and will raise ValueError in a future version.  Do `left, right = left.align(right, axis=1, copy=False)` before e.g. `left == right`

经过一些调试,我发现从csv加载的DataFrame和原来的DataFrame不一样:

# The DataFrames look identical, but comparing gives me a ValueError:
df
df1
df == df1

输出为:

   0  1
0  1  2
1  3  4

   0  1
0  1  2
1  3  4

Traceback (most recent call last):

  File "tmp.py", line 30, in <module>
    df == df1

  File "python3.9/site-packages/pandas/core/ops/common.py", line 69, in new_method
    return method(self, other)

  File "python3.9/site-packages/pandas/core/arraylike.py", line 32, in __eq__
    return self._cmp_method(other, operator.eq)

  File "python3.9/site-packages/pandas/core/frame.py", line 6851, in _cmp_method
    self, other = ops.align_method_FRAME(self, other, axis, flex=False, level=None)

  File "python3.9/site-packages/pandas/core/ops/__init__.py", line 288, in align_method_FRAME
    raise ValueError(

ValueError: Can only compare identically-labeled DataFrame objects

提前致谢。

如果您要遍历数据框,我建议您将 df 转换为字典。

df_dict = df.to_dict('records')

由于 article 详细信息,速度要快得多。

现在您可以枚举 df_dict 并将其与您想要的数据相匹配。

    target_values = {'col1': 'foo', 'col2': 'bar', ...}
    for i, row in enumerate(df_dict):
          if row == target_values:
                match_index = i

也许一个好主意是从仅匹配一列开始,如果它匹配,检查其他所有内容是否也相同。