Значения поиска и значения суммы в панд ячеек

#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