使用concat后遇到空的DF时,Pandas isin返回错误

时间:2019-06-06 14:18:00

标签: python pandas python-3.6

在使用concat然后使用isin删除所有行时,遇到:

  

ValueError:无法计算具有重复轴的isin。

同时,如果DF中还有任何行,则没有问题。同样,在任何情况下都不使用concat可以正常工作,可以正常返回一个空DF。我正在尝试使用concat,因为在我的用例中它会更快一些。

熊猫0.24.2(最新)。

df = pd.DataFrame()
for r in range(5):
    df = df.append({'type':'teine', 'id':r}, ignore_index=True)

# Problem line
df = pd.concat([df.reset_index(drop=True), pd.DataFrame({'type':'teine', 'id':5}, index=[0])], sort=True)
dfCopy = df.copy()
df.query("(type == 'teine')", inplace=True)
df = dfCopy[~dfCopy.isin(df).all(axis=1)]

2 个答案:

答案 0 :(得分:2)

在该行中:

df = pd.concat([df.reset_index(drop=True), pd.DataFrame({'type':'teine', 'id':5}, index=[0])], sort=True)

无需重置concat(df.reset_index(drop=True))内部的索引。但是您必须在concat之后重设索引以避免错误。看起来是这样的:

df = pd.concat([df, pd.DataFrame({'type':'teine', 'id':5}, index=[0])], sort=True).reset_index(drop=True)

答案 1 :(得分:1)

您可以避免不重复索引的问题:

df = pd.DataFrame()
for r in range(5):
    df = df.append({'type':'teine', 'id':r}, ignore_index=True)

# Problem line
df = pd.concat([df.reset_index(drop=True), pd.DataFrame({'type':'teine', 'id':5}, index=[max(df.index.values)+1])], sort=True)
dfCopy = df.copy()
df.query("(type == 'teine')", inplace=True)
df = dfCopy[~dfCopy.isin(df).all(axis=1)]

或者更好的是,您可以在串联后重置索引:

df = pd.DataFrame()
for r in range(5):
    df = df.append({'type':'teine', 'id':r}, ignore_index=True)

# Problem line
df = pd.concat([df, pd.DataFrame({'type':'teine', 'id':5}, index=[0])], sort=True).reset_index(drop=True)
dfCopy = df.copy()
df.query("(type == 'teine')", inplace=True)
df = dfCopy[~dfCopy.isin(df).all(axis=1)]