【问题标题】:python dataframe ValueError Both index level and column labelpython dataframe ValueError 索引级别和列标签
【发布时间】:2021-07-20 10:27:43
【问题描述】:

我正在尝试加入 20 种不同股票的多个高低差异。
我用了这个 doe,然后给我错误信息:

raise ValueError(msg) ValueError: 'date' is both an index level and a column label, which is ambiguous.
import pandas as pd

def test_demo():
    tickers = ['ADI', 'ACN', 'ABT']

    df2 = pd.DataFrame()
    main_df = pd.DataFrame()

    for count, ticker in enumerate(tickers):
        df = pd.read_csv('demo\{}.csv'.format(ticker))

        count += 1

        df2['date'] = df['date']
        df2['diff'] = (df['high'] - df['low'])
        df2 = df2.set_index('date')
        df2.rename(columns={'diff': ticker}, inplace=True)
        print(df2)  
        if main_df.empty:
            main_df = df2
            count = 1
        else:
            main_df = main_df.join(df2, on='date', how='outer')

        if count % 10 == 0:
            print(count)

    main_df.to_csv('testdemo.csv')

test_demo()

我需要 ['date'] 作为索引。因为一些股票数据在不同时期运行。 我有什么选择?
错误信息与代码混在一起。

                 ADI
date                
1996-01-02  0.375000
1996-01-03  0.437500
1996-01-04  0.421875
....
2020-12-30  2.110001
2020-12-31  2.130005

[6295 rows x 1 columns]
           ADI  ACN
Traceback (most recent call last):
date               
NaN   0.375000  NaN
NaN   0.437500  NaN
NaN   0.421875  NaN
  File "D:\PycharmProjects\backtraderP1\Main.py", line 81, in <module>
NaN   0.375000  NaN
    from zfunctions.WebDemo import test_demo
NaN   0.140625  NaN
  File "D:\PycharmProjects\backtraderP1\zfunctions\WebDemo.py", line 30, in <module>
...        ...  ...
    test_demo()
NaN   1.470001  NaN
NaN   3.039993  NaN
  File "D:\PycharmProjects\backtraderP1\zfunctions\WebDemo.py", line 23, in test_demo
NaN   2.500000  NaN
NaN   2.110001  NaN
    main_df = main_df.join(df2, on='date', how='outer')
NaN   2.130005  NaN

  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\frame.py", line 8110, in join
[6295 rows x 2 columns]
    return self._join_compat(
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\frame.py", line 8135, in _join_compat
    return merge(
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\reshape\merge.py", line 74, in merge
    op = _MergeOperation(
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\reshape\merge.py", line 668, in __init__
    ) = self._get_merge_keys()
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\reshape\merge.py", line 1058, in _get_merge_keys
    left_keys.append(left._get_label_or_level_values(k))
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\generic.py", line 1679, in _get_label_or_level_values
    self._check_label_or_level_ambiguity(key, axis=axis)
  File "C:\Users\Cornerstone\AppData\Roaming\Python\Python39\site-packages\pandas\core\generic.py", line 1638, in _check_label_or_level_ambiguity
    raise ValueError(msg)
ValueError: 'date' is both an index level and a column label, which is ambiguous.

Process finished with exit code 1

上面是错误信息的痕迹

如果我不做任何计算,代码就可以工作。 我没有追随我两次约会的地方

以下代码可以正常运行

import pandas as pd

def test_demo():
    tickers = ['ADI', 'ACN', 'ABT']
      
    main_df = pd.DataFrame()
    
    for count, ticker in enumerate(tickers):
        df = pd.read_csv('demo\{}.csv'.format(ticker))
        # df.set_index('date', inplace=True)
        count += 1

        df.rename(columns={'value': ticker}, inplace=True)

        df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
        df.drop(['open', 'high', 'low', 'close', 'volume', 'position', 'cash'], 1, inplace=True)
        df = df.set_index('date')
        # print(df)
        # print(DataFrame.dtypes)

        if main_df.empty:
            main_df = df
            count = 1
        else:
            main_df = main_df.join(df, on='date', how='outer')
            # main_df = main_df.merge(df, on='date')
            # print(main_df)
        if count % 10 == 0:
            print(count)


    main_df.to_csv('testdemo.csv')


test_demo()

【问题讨论】:

  • 能分享一下错误的堆栈跟踪吗
  • 我编辑了它。并添加了错误的堆栈跟踪。
  • 正如错误消息所说:您的数据框中有两次“日期”,这是不明确的。重命名“日期”列或索引,或在设置索引后删除“日期”列。
  • 堆栈跟踪与 print 的输出混合在一起很奇怪:也许是 PyCharm 的东西?
  • 跟踪与输出混合,是的,PyCharm。今天给我的第一个。反正。我添加了另一段工作代码。与第一个代码非常相似。我不知道如何让第一个工作。非常感谢。

标签: python pandas dataframe indexing valueerror


【解决方案1】:

answer to index error

根据这篇文章,我将 df2['date'] = df['date'] 更改为df2['date'] = df.index 这解决了索引模糊错误。

由于两组数据涵盖了两个不同的时间段,我有一个新的错误ValueError: Length of values (4895) does not match length of index (6295)

【讨论】:

    【解决方案2】:

    我认为可以简化您的代码以创建 DataFrames 列表并按日期在 concat 中加入外部联接:

    def test_demo():
        
        dfs = []
        tickers = ['ADI', 'ACN', 'ABT']
        for count, ticker in enumerate(tickers):
            df = pd.read_csv('demo\{}.csv'.format(ticker))
            count += 1
    
            df = df.set_index('date')
            df[ticker] = df['high'] - df['low']
    
            print(df)  
            dfs.append(df)
    
            if count % 10 == 0:
                print(count)
    
        main_df = pd.concat(dfs, axis=1)
        main_df.to_csv('testdemo.csv')
    
    test_demo()
    

    【讨论】:

    • concat 将所有内容添加到文件中。每个文件中只有一列。和日期。该演示只有三个文件。当使用更多的代码时,它会有所作为。您的代码没有错误。非常感谢您的回复。如果我这样做 df2[ticker] = df['high'] - df['low'] 那么我无法解决错误 ValueError: Length of values (4895) does not match length of index (6295) 我怀疑 NaN 值,但请看第二组有问题的代码,NaN 可能不是问题。我不知道从哪里开始考虑这个问题。
    • ACN 于 2001 年 7 月上市,另外两家上市时间较长。所以存在长度差异。
    • @DMG 在我的代码中没有df2,所以需要df[ticker] = df['high'] - df['low']
    • 我明白了,但您的代码的最终结果是 [indexdate][ticker1open][ticker1high]... ...[ticker1volume][ticker1diff][ticker2open][ticker2high]... 。 ..[ticker2volume][ticker2diff]...每个股票代码有 6 列。如果我在 500 个代码上运行它,将是 3000 列,excel 可能甚至无法打开。所以我只想在最终产品中使用 [indexdate][ticker1diff][ticker2diff]....[tickerNdiff]。我输入的数据是 1996~2020 年的,ACN 于 2001-07-19 公开,所以数据较短。我认为这是问题的主要原因。我不知道如何解决它。非常感谢。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2018-06-14
    • 2015-07-19
    相关资源
    最近更新 更多