连接DataFrame时抛出InvalidIndexError

1 投票
1 回答
52 浏览
提问于 2025-04-13 02:41

我正在从网址(RSS源)提取信息,想要创建一个包含我进行情感分析所需的所有数据的大数据框。我写了一个函数,用来把每个网址放进一个字典里,然后用解析器处理这些网址,最后把结果放到一个数据框中。但是在进行了5次操作后,我遇到了一个错误:

InvalidIndexError: Reindexing only valid with uniquely valued Index objects.

我使用了一个字典,格式是 {'name': 'url'},下面是我的代码:

def extract_content(urls):
    df_final = pd.DataFrame()

    for url in urls.values():
        xml = feedparser.parse(url)
        entries = xml['entries']
        df = pd.DataFrame(entries)
        
        if 'media_content' in df.columns:
            df.rename(columns = {'media_content': 'content'}, inplace = True)

        if 'content' not in df.columns:
            df.rename(columns={'summary': 'content'}, inplace=True)

        df = df[['title', 'link', 'published', 'published_parsed', 'content']]
        df_final = pd.concat([df_final, df]).reset_index(drop = True)

    return df_final

我该怎么解决这个问题呢?

我试过使用reset_index(),但还是不行。

1 个回答

0

可能的重复列名

我觉得这个问题是因为列名重复了。比如,下面的代码就会出现这个错误:

df_final = pd.DataFrame({'A': [1, 2], 'B': [3,4]})
df = pd.DataFrame({'A': [1, 2], 'B': [5,5], 'C': [5, 6]})
df.rename(columns = {'C': 'A'}, inplace=True)
df = df[['A', 'B']]
df_final = pd.concat([df_final, df]).reset_index(drop = True)
df_final

在这段代码中,我首先把数据表df中的列'C'重命名为'A'。在重命名时,即使已经有一个叫'A'的列,也不会报错,但在合并的时候就会出现错误:'InvalidIndexError: Reindexing only valid with uniquely valued Index objects',这是因为列名重复了。我觉得在你的情况下也是这样,当你把列'media_content'重命名为'content'时,你没有检查过'dataframe df'中是否已经有一个'content'的列名。如果'dataframe df'中已经有'content'这个列名,那么在合并时就会出现你报告的错误。

我这里看到两个可能的解决办法:

解决办法 1

在合并之前,先去掉重复的列:

df_final = pd.DataFrame({'A': [1, 2], 'B': [3,4]})
df = pd.DataFrame({'A': [1, 2], 'B': [5,5], 'C': [5, 6]})
df.rename(columns = {'C': 'A'}, inplace=True)
df = df[['A', 'B']]
df = df.loc[:,~df.columns.duplicated()]
df_final = pd.concat([df_final, df]).reset_index(drop = True)
df_final

这样输出就不会报错,并且会得到预期的结果(我们只保留第一个列名'A'):

    A   B
0   1   3
1   2   4
2   1   5
3   2   5

解决办法 2

只有在想要的列名在数据表df中不存在时,才进行重命名:

df_final = pd.DataFrame({'A': [1, 2], 'B': [3,4]})
df = pd.DataFrame({'A': [1, 2], 'B': [5,5], 'C': [5, 6]})
if 'A' not in df.columns:
    df.rename(columns = {'C': 'A'}, inplace=True)
df = df[['A', 'B']]
df_final = pd.concat([df_final, df]).reset_index(drop = True)
df_final

撰写回答