#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].