Совпадение индексов в Pandas?

#python #python-3.x #pandas #jupyter-notebook

#python #python-3.x #pandas #jupyter-ноутбук

Вопрос:

Я пытаюсь сопоставить значение x на основе их ключей строк и столбцов. В Excel я использовал INDEX amp; MATCH для получения правильных значений, но я изо всех сил пытаюсь сделать то же самое в Pandas.

Пример:

Я хочу добавить выделенное значение (сохраненное в df2) в мой столбец df [‘Cost’].

У меня есть df [‘Weight’] и df [‘Country’] в качестве ключей, но я не знаю, как использовать их для поиска выделенного значения в df2.

Как я могу получить желтое значение в df3 [‘Postage’], которое я затем могу использовать, чтобы добавить его в свой столбец df [‘Cost’]?

Упрощенная матрица

Надеюсь, это имеет смысл. Дайте мне знать, я должен предоставить больше информации.

Редактировать — дополнительная информация (извините, я не мог понять, как скопировать выходные данные из Jupyter): введите описание изображения здесь

Когда я запускаю [93] Я получаю следующую ошибку:

 ValueError: Row labels must have same size as column labels
 

Спасибо!

Комментарии:

1. Пожалуйста, предоставьте несколько примеров ваших фреймов данных (df2, df3 и т. Д.)

2. покажите нам пример в фрейме данных python pandas

3. Вызывается индексация строк и столбцов lookup , аналогично excel.

4. Спасибо, я добавил еще немного информации. Дайте мне знать, если это полезно.

Ответ №1:

Чтобы получить выделенное значение 1.75 , просто

 df2.loc[df2['Country']=='B', 3]
 

Итак, обобщая вышесказанное и используя пары ключей с весом страны из df1 :

 cost = []

for i in range(df1.shape[0]):
    country = df1.loc[i, 'Country']
    weight = df1.loc[i, 'Weight']
    cost.append(df2.loc[df2['Country']==country, weight]

df1['Cost'] = cost
 

Или намного лучше:

 df1['Cost'] = df1.apply(lambda x: df2.loc[df2['Country']==x['Country'], x['Weight'], axis=1)
 

Комментарии:

1. Большое вам спасибо! Ваш последний ответ помог мне! Сначала я не смог его использовать, потому что вес строки (int) сравнивался со столбцами (str). Похоже, преобразование веса в объекты помогло!

Ответ №2:

для вашего случая (примечание [0] необходимо для индексации в массив)

 row = df1.iloc[1]
df2[df2.Country == row.Country][row.Weight][0]
 

Надеюсь, это поможет.iloc и .loc

 d = {chr(ord('A') r):[c r*10 for c in range(5)] for r in range(5)}
df = pd.DataFrame(d).transpose()
df.columns=['a','b','c','d','e']
print(df)
print("--------")
print(df.loc['B']['c'])
print(df.iloc[1][2])
 

вывод

     a   b   c   d   e
A   0   1   2   3   4
B  10  11  12  13  14
C  20  21  22  23  24
D  30  31  32  33  34
E  40  41  42  43  44
--------
12
12
 

Комментарии:

1. Спасибо, к сожалению, я получаю следующую ошибку: TypeError: невозможно индексировать по индексу местоположения с помощью нецелочисленного ключа

2. (Спасибо @Leonardus Chen) — исправлена ошибка поиска строки с df. Страна == строка. Страна. А затем индексируйте в arr по строкам. Значение веса … затем верните значение [0].