#python #pandas #dataframe #vlookup
Вопрос:
У меня есть два кадра данных:
df1 = pd.DataFrame({'Code' : ['10', '100', '1010'],
'Value' : [25, 50, 75]})
df2 = pd.DataFrame({'ID' : ['A', 'B', 'C'],
'Codes' : ['10', '100;1010', '100'],
'Value' : [25, 125, 50]})
Столбец «Коды» в df2 может содержать несколько кодов, разделенных символом»;». Если это так, мне нужно суммировать их значения из df1.
Я попробовал .map(), но это не сработало для строк с несколькими кодами подряд. Кроме того, я в конечном итоге преобразую код «1010» в значение «2525».
Как мне указать идеальное совпадение и суммирование для значений, разделенных»;»?
Комментарии:
1. Хотя вы немного запоздали с ответом на этот вопрос, вы также можете взглянуть на мое решение.
Ответ №1:
explode()
список кодовmerge()
с помощью df1 и рассчитайте общее количество, группируясь по индексу df2- создали новый столбец с этим рассчитанным
df1 = pd.DataFrame({"Code": ["10", "100", "1010"], "Value": [25, 50, 75]})
df2 = pd.DataFrame(
{"ID": ["A", "B", "C"], "Codes": ["10", "100;1010", "100"], "Value": [25, 125, 50]}
)
df2.join(
df2["Codes"]
.str.split(";")
.explode()
.reset_index()
.merge(df1, left_on="Codes", right_on="Code")
.groupby("index")
.agg({"Value": "sum"}),
rsuffix="_calc",
)
ID | Коды | Ценность | Value_calc | |
---|---|---|---|---|
0 | A | 10 | 25 | 25 |
1 | B | 100;1010 | 125 | 125 |
2 | C | 100 | 50 | 50 |
Ответ №2:
def sum(df1, df2):
df1['sum'] = df1['Value'] df2['Value']
print(df1)
df1.loc[df2['Codes'].isin(df1['Code'])].apply(sum(df1, df2))
Если код в df2 находится в df1, то можно добавить значения
Ответ №3:
Мы можем создать таблицу Code
поиска для Value
сопоставления с df1
, а затем использовать .map()
df2
ее для сопоставления расширенного списка Codes
с отображением. Наконец, суммируйте сопоставленные значения для одного и того же ID
, чтобы получить желаемое значение, следующим образом:
1. Составьте таблицу Code
поиска для Value
сопоставления с df1
:
mapping = df1.set_index('Code')['Value']
2. Используйте .map()
вкл df2
.для сопоставления расширенного списка Codes
с отображением. Суммируйте сопоставленные значения для одного и того же ID
, чтобы получить желаемое значение:
df2a = df2.set_index('ID') # set `ID` as index
df2a['value_map'] = (
df2a['Codes'].str.split(';') # split by semicolon
.explode() # expand splitted values into rows
.map(mapping) # map Code from mapping
.groupby('ID').sum() # group sum by ID
)
df2 = df2a.reset_index() # reset `ID` from index back to data column
Результат:
print(df2)
ID Codes Value value_map
0 A 10 25 25
1 B 100;1010 125 125
2 C 100 50 50