【问题标题】:KeyError: Int64Index([1], dtype='int64') when using drop_duplicatesKeyError: Int64Index([1], dtype='int64') 当使用 drop_duplicates
【发布时间】:2021-03-10 11:14:39
【问题描述】:

我编写了一个简单的脚本,它应该合并(联合)一些数据帧并删除重复项。

例如, 对于输入:

df_A:
a  1
b  2

df_B:
b  2
c  3

预期的输出是:

df_out:
a  1
b  2
c  3

我写了以下代码:

def read_dataframes(filenames, basedir):
    return [pd.read_csv(basedir + file, sep='\t', header=None, quoting=csv.QUOTE_NONE) for file in filenames]


def merge_dataframes(dfs, out):
    merged = pd.concat(dfs).drop_duplicates(subset=[0, 1]).reset_index(drop=True)
    merged = merged.iloc[:, [0, 1, 2, 7, 8, 9]]
    merged.to_csv(out, header=None, index=None, sep='\t')

我以下列方式调用这些函数:

merge_dataframes(read_dataframes(filenames, basedir), output)

我遇到了KeyError 的异常:

Traceback (most recent call last):
  File "analysis_and_visualization.py", line 70, in <module>
    merge_dataframes(read_dataframes(wild_emb, wild_basedir), 'wild_emb_merged')
  File "analysis_and_visualization.py", line 17, in merge_dataframes
    merged = pd.concat(dfs).drop_duplicates(subset=[0, 1]).reset_index(drop=True)
  File "/Data/user/eliran/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 5112, in drop_duplicates
    duplicated = self.duplicated(subset, keep=keep)
  File "/Data/user/eliran/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 5248, in duplicated
    raise KeyError(diff)
KeyError: Int64Index([1], dtype='int64')

我做错了什么?

【问题讨论】:

  • 一个想法 - 似乎第一列被转换为索引,为了防止它尝试使用return [pd.read_csv(basedir + file, sep='\t', header=None, quoting=csv.QUOTE_NONE, index_col=False) for file in filenames]

标签: python pandas


【解决方案1】:

遍历frame.py中的source code和函数duplicated

您的数据框中的所有列似乎都不存在。

Class DataFrame()

def duplicated(self)-sn-p

  # Verify all columns in subset exist in the queried dataframe
        # Otherwise, raise a KeyError, same as if you try to __getitem__ with a
        # key that doesn't exist.
        diff = Index(subset).difference(self.columns)
        if not diff.empty:
            raise KeyError(diff)

df = pd.DataFrame({'col1' : [0,1,2], 'col3' : [1,2,3]})

print(df)

  col1  col3
0     0     1
1     1     2
2     2     3


df.drop_duplicates(subset=['col1','col2'])

   5246         diff = Index(subset).difference(self.columns)
   5247         if not diff.empty:
-> 5248             raise KeyError(diff)
   5249 
   5250         vals = (col.values for name, col in self.items() if name in subset)

KeyError: Index(['col2'], dtype='object')

【讨论】:

    【解决方案2】:

    我认为这里的问题不是列1,因为第一列被转换为index,所以部分或全部DataFrames只有一个名为0的列。

    为了防止它在read_csv中使用index_col=False参数:

    def read_dataframes(filenames, basedir):
        return [pd.read_csv(basedir + file, sep='\t', header=None, quoting=csv.QUOTE_NONE, index_col=False) for file in filenames]
    

    另一个问题应该是由于某种原因只有一列数据,所以第二列称为2 不存在。

    【讨论】:

    • 添加了 index_col=False 但仍然会导致相同的错误。我会调查该列不存在的可能性
    猜你喜欢
    • 2020-05-10
    • 2021-01-17
    • 2019-09-16
    • 1970-01-01
    • 2020-05-26
    • 2021-10-15
    • 2013-01-06
    • 2019-09-04
    • 2021-04-28
    相关资源
    最近更新 更多