熊猫ValueError:只能比较标记相同的Series对象python

时间:2018-07-03 03:04:10

标签: python pandas

我有两个CSV文件,我正在比较并仅并排返回具有不同值的列。因此,如果其中一列中的一个值为空,则代码将出现错误:

  

ValueError:只能比较标记相同的Series对象

import pandas as pd


df1=pd.read_csv('csv1.csv')
df2=pd.read_csv('csv2.csv')




def process_df(df):
    res = df.set_index('Country').stack()
    res.index.rename('Column', level=1, inplace=True)
    return res

df1 = process_df(df1)
df2 = process_df(df2)
mask = (df1 != df2) & ~(df1.isnull() & df2.isnull())
df3 = pd.concat([df1[mask], df2[mask]], axis=1).rename({0:'From', 1:'To'}, axis=1)
print(df3)

我当前的输出没有丢失值:

                      From       To
Country      Column                  
Bermuda     1980    0.00793    0.00093
            1981    0.00687    0.00680
            1986    0.00700    1.00700
Mexico      1980    3.72819    3.92819

如果缺少某些值,我只想要一个空单元格,例如下面的示例:

                       From       To
Country      Column                  
Bermuda     1980    0.00793    0.00093
            1981    0.00687             <--- Missing value
            1986    0.00700    1.00700
Mexico      1980    3.72819    3.92819

1 个答案:

答案 0 :(得分:0)

问题在于索引不匹配...作为一个简化的示例(请注意,如果将空元素('')传递给df1而不是{{ 1}}元素会产生相同的结果):

[4]

使用相同的DF结构但更改索引...

In [21]: df1 = pd.DataFrame([[1], [4]])

In [22]: df1
Out[22]: 
   0
0  1
1  4

现在比较...

In [23]: df2 = pd.DataFrame([[3], [2]], index=[1, 0])

In [24]: df2
Out[24]: 
   0
1  3
0  2

要证明索引问题-重铸In [25]: df1[0] == df2[0] ValueError: Can only compare identically-labeled Series objects ,不要使用反向索引...

df2

以及进行的比较:

In [26]: df3 = pd.DataFrame([[3], [2]])

In [27]: df3
Out[27]: 
   0
0  3
1  2

修复

您将不得不为In [28]: df1[0] == df3[0] Out[28]: 0 False 1 False Name: 0, dtype: bool 之一重新建立索引-就像这样(这使用的是“可排序”索引-对于更复杂的多重索引来说更具挑战性):

df

如果您可以提供CSV数据,我们可以尝试使用多索引...

多索引

In [44]: df2.sort_index(inplace=True) In [45]: df1[0] == df2[0] Out[45]: 0 False 1 False Name: 0, dtype: bool 方法具有可以传递的.sort_index()属性。您可以传递int or level name or list of ints or list of level names。因此,您可以执行以下操作:

level=