【问题标题】:Python Pandas Only Compare Identically Labeled DataFrame ObjectsPython Pandas 仅比较具有相同标签的 DataFrame 对象
【发布时间】:2016-05-31 23:19:53
【问题描述】:

我在这里尝试了所有解决方案: Pandas "Can only compare identically-labeled DataFrame objects" error

对我不起作用。这就是我所拥有的。我有两个数据框。一个是系统中已经存在的一组财务数据,另一个是系统中可能存在或不存在的一些财务数据。我需要找出差异并添加不存在的东西。

代码如下:

import pandas as pd
import numpy as np
from azure.storage.blob import AppendBlobService, PublicAccess, ContentSettings
from io import StringIO

dataUrl = "http://ichart.finance.yahoo.com/table.csv?s=MSFT"
blobUrlBase = "https://pyjobs.blob.core.windows.net/"
data = pd.read_csv(dataUrl)

abs = AppendBlobService(account_name='pyjobs', account_key='***')
abs.create_container("stocks", public_access = PublicAccess.Container)
abs.append_blob_from_text('stocks', 'msft', data[:25].to_csv(index=False))
existing = pd.read_csv(StringIO(abs.get_blob_to_text('stocks', 'msft').content))

ne = (data != existing).any(1)

失败的代码是最后一行。我正在阅读一篇关于确定数据帧之间差异的文章。

我检查了所有列上的 dtypes,它们似乎是相同的。我还做了一个并排输出,我对轴、索引进行了排序,删除了索引等。仍然得到那个血腥的错误。

这里是现有数据和数据的第一行的输出

>>> existing[:1]
         Date       Open   High    Low  Close    Volume  Adj Close
0  2016-05-27  51.919998  52.32  51.77  52.32  17653700      52.32
>>> data[:1]
         Date       Open   High    Low  Close    Volume  Adj Close
0  2016-05-27  51.919998  52.32  51.77  52.32  17653700      52.32

这是我收到的确切错误:

>>> ne = (data != existing).any(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda3\lib\site-packages\pandas\core\ops.py", line 1169, in f
    return self._compare_frame(other, func, str_rep)
  File "C:\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3571, in _compare_frame
    raise ValueError('Can only compare identically-labeled '
ValueError: Can only compare identically-labeled DataFrame objects

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    为了解决这个问题,您需要比较底层的 numpy 数组。

    import pandas as pd
    
    df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'], index=['One', 'Two'])
    df2 = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'], index=['one', 'two'])
    
    
    df1.values == df2.values
    
    array([[ True,  True],
           [ True,  True]], dtype=bool)
    

    【讨论】:

    • 这确实解决了最初的错误,因此标记为答案,但是它不会逐个元素进行比较。我期待一个布尔值矩阵(或类似的布尔数据结构)。我正在返回一个布尔值 true 或 false。
    • 重要的是要注意我的数据框大小不同。
    • 这里到底发生了什么?即使考虑到大写,我也会遇到相同的列和索引名称相同的错误。
    • @DavidCrook,你找到答案了吗?我有同样的情况 - 两个相同大小的数据帧具有相同的索引、相同的列、相同的 dtypes,但是在尝试使用 compare() 和 equals() 时出现此错误..不知道会发生什么..
    • @Tatiana 在其中一个值上使用 .values[0] 解决了我的问题。
    【解决方案2】:

    如果您想比较 2 个数据框。在 Pandas 中签出灵活比较,使用 .eq()、.nq()、gt() 等方法... --> 等于、不等于和大于。

    例子:

    df['new_col'] = df.gt(df_1)

    http://pandas.pydata.org/pandas-docs/stable/basics.html#flexible-comparisons

    【讨论】:

    • 灵活比较有什么不同?文档似乎没有提到它们存在的原因
    【解决方案3】:

    复制了一些虚假数据,以达到去除重复的最终目标。请注意,这不是原始问题的答案,而是我试图做的导致问题的答案。

    b = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                        'B': ['B4', 'B5', 'B6', 'B7'],
                        'C': ['C4', 'C5', 'C6', 'C7'],
                        'D': ['D4', 'D5', 'D6', 'D7']},
                        index=[4, 5, 6, 7])
    
    
    c = pd.DataFrame({'A': ['A7', 'A8', 'A9', 'A10', 'A11'],
                      'A': ['A7', 'A8', 'A9', 'A10', 'A11'],
                      'B': ['B7', 'B8', 'B9', 'B10', 'B11'],
                      'C': ['C7', 'C8', 'C9', 'C10', 'C11'],
                      'D': ['D7', 'D8', 'D9', 'D10', 'D11']},
                       index=[7, 8, 9, 10, 11])
    
    result = pd.concat([b,c])
    idx = np.unique(result["A"], return_index=True)[1]
    result.iloc[idx].sort()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多