pandas: ValueError: можно сравнивать только объекты серии с одинаковыми метками

avatar
Karma
8 апреля 2018 в 02:39
397
1
1

У меня есть 2 CSV-файла, как показано ниже. Я хочу определить, выше/ниже ли отдельные показатели (в df1) среднего класса (в df2), используя функцию сравнения после нахождения их значений.

df1:
 Name    Class    Test1    Test2    Test3
 John       9A       75       83       77
David       9B       65       67       55
Peter       9A       85       90       88
  Tom       9C       74       92       78

df2:
Class    Test1    Test2    Test3
   9A       80       82       84
   9B       84       75       77
   9C       75       78       80

Вот мой метод, не стесняйтесь исправлять/направлять меня, если я ошибаюсь. Сначала я нахожу Class человека в df1, например. John равно 9A, затем возвращаются другие столбцы, такие как Test1 или Test2 в df2 на основе 9A

target_class = df1.loc[df1['Name'] == 'John', 'Class']
print(target_class)
>>>>9A
Test1_avg = df2.loc[df2['Class'] == target_class, 'Test1']
# ideally it should return 80

И я получил это ValueError: Can only compare identically-labeled Series objects

Или просто, как бы вы сравнили Test1 Джона в df1 с Test1 класса 9A в df2? Есть ли способ проще моего? Спасибо за помощь!

Обновление: затем я буду использовать функцию сравнения, подобную этой, чтобы вернуть оценку, если она соответствует критериям

.
def comparison(a, b):
    return 2 if a > b else 1 if a == b else -1
Источник

Ответы (1)

avatar
jpp
8 апреля 2018 в 02:51
1

Это в одну сторону через pandas.merge.

# rename df2 columns
df2 = df2.rename(columns={'Test'+str(x): 'AvgTest'+str(x) for x in range(1, 4)})

# left merge df1 on df2
res = pd.merge(df1, df2, how='left', on=['Class'])

# calculate comparison results
comparison = pd.DataFrame(res.loc[:, res.columns.str.startswith('Test')].values  >= \
                          res.loc[:, res.columns.str.startswith('AvgTest')].values,
                          columns=['Comp'+str(x) for x in range(1, 4)])

# join results to dataframe
res = res.join(comparison)

print(res)

#     Name Class  Test1  Test2  Test3  AvgTest1  AvgTest2  AvgTest3  Comp1  \
# 0   John    9A     75     83     77        80        82        84  False   
# 1  David    9B     65     67     55        84        75        77  False   
# 2  Peter    9A     85     90     88        80        82        84   True   
# 3    Tom    9C     74     92     78        75        78        80  False   

#    Comp2  Comp3  
# 0   True  False  
# 1  False  False  
# 2   True   True  
# 3   True  False  
Karma
9 апреля 2018 в 00:23
0

Спасибо! Я никогда не думал об объединении 2 dfs в 1. Просто быстрый вопрос: что, если я хочу, чтобы функция сравнения возвращала число вместо логического значения, скажем, если Test1> AvgTest1, а затем возвращает число / целое, например 2, если Test1 = AvgTest1 , вернуть 1, если Test1<AvgTest1, вернуть -1? Что бы ты сделал? Я только что обновил свой ответ, но как мне реализовать в нем ваш loc? Спасибо.