我有两个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
答案 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=