pandas ValueError: может сравнивать только идентифицированные объекты серии Python - PullRequest
0 голосов
/ 03 июля 2018

У меня есть два 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 голосов
/ 03 июля 2018

Проблема в том, что индексы не совпадают ... В качестве упрощенного примера (обратите внимание, что если вы передаете пустой элемент ('') в df1 вместо, скажем, элемента [4], который он производит тот же результат):

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

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

Используя ту же структуру DF, но изменяя индекс ...

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 - вот так (это использует «сортируемый» индекс - так сложнее для более сложного многоиндексного):

In [44]: df2.sort_index(inplace=True)

In [45]: df1[0] == df2[0]
Out[45]: 
0    False
1    False
Name: 0, dtype: bool

Если вы можете предоставить данные CSV, мы могли бы попробовать их с мультииндексом ...

Multi-Index

Метод .sort_index() имеет атрибут level=, который можно передать. Вы можете передать int или имя уровня или список целых чисел или список имен уровней . Таким образом, вы можете сделать что-то вроде:

df2.sort_index(level='level_name', inplace=True)

# as a list of levels... it will all depend on your original df index

levels = ['level_name1', 'level_name2]
df2.sort_index(level=levels, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...