У меня есть датафрейм df

df

   Object        Action  Cost1  Cost2
0     123      renovate  10000   2000
1     456  do something      0     10
2     789        review   1000     50

И словарь (так называемый словарь)

dictionary

{'Object_new': ['Object'],
 'Action_new': ['Action'],
 'Total_Cost': ['Cost1', 'Cost2']}

Кроме того, у меня есть (в начале пустой) фрейм данных df_new , который должен содержать почти такую же информацию, как df, за исключением того, что имена столбцов должны быть разными (именование по словарю) и что некоторые столбцы из df должен быть объединен (например, операция суммирования) на основе словаря.

Результат должен выглядеть так:

df_new

   Object_new    Action_new  Total_Cost
0         123      renovate       12000
1         456  do something          10
2         789        review        1050

Как я могу достичь этого результата, используя только словарь? Я пытался использовать функцию .map (), но не мог понять, как выполнить суммирование с ней.

Код для воспроизведения как данных, так и словаря прилагается:

# import libraries
import pandas as pd


### create df
data_df = {'Object':  [123, 456, 789],
        'Action': ['renovate', 'do something', 'review'],
        'Cost1': [10000, 0, 1000],
        'Cost2': [2000, 10, 50],
        }

df = pd.DataFrame(data_df)


### create dictionary
dictionary = {'Object_new':['Object'], 
              'Action_new':['Action'], 
              'Total_Cost' : ['Cost1', 'Cost2']}


### create df_new
# data_df_new = pd.DataFrame(columns=['Object_new', 'Action_new', 'Total_Cost' ])
data_df_new = {'Object_new':  [123, 456, 789],
        'Action_new': ['renovate', 'do something', 'review'],
        'Total_Cost': [12000, 10, 1050],
        }
df_new = pd.DataFrame(data_df_new)
1
constiii 4 Июл 2019 в 00:53

4 ответа

Лучший ответ

Игра с groupby:

inv_dict = {x:k for k,v in dictionary.items() for x in v}
df_new =  df.groupby(df.columns.map(inv_dict),
                     axis=1).sum()

Выход:

     Action_new  Object_new  Total_Cost
0      renovate         123       12000
1  do something         456          10
2        review         789        1050
2
Quang Hoang 3 Июл 2019 в 22:23

Учитывая сложность вашего алгоритма, я бы предложил выполнить операцию сложения Series для решения этой проблемы.

Почему? В Pandas каждый столбец в DataFrame работает как Series под колпаком.

data_df_new = {
    'Object_new': df['Object'],
    'Action_new': df['Action'],
    'Total_Cost': (df['Cost1'] + df['Cost2'])  # Addition of two series
}

df_new = pd.DataFrame(data_df_new)

Запуск этого кода отобразит все значения, содержащиеся в вашем наборе данных, которые будут храниться в нашем словаре.

1
Juan Morais 3 Июл 2019 в 22:11

Вы можете использовать пустой фрейм данных для копирования нового столбца и использовать to_dict для преобразования его в словарь.

import pandas as pd
import numpy as np

data_df = {'Object':  [123, 456, 789],
        'Action': ['renovate', 'do something', 'review'],
        'Cost1': [10000, 0, 1000],
        'Cost2': [2000, 10, 50],
        }

df = pd.DataFrame(data_df)
print(df) 
MyEmptydf = pd.DataFrame()
MyEmptydf['Object_new']=df['Object']
MyEmptydf['Action_new']=df['Action']
MyEmptydf['Total_Cost'] = df['Cost1'] + df['Cost2']

print(MyEmptydf) 
dictionary = MyEmptydf.to_dict(orient="index")
print(dictionary) 

Вы можете запустить код здесь: https://repl.it/repls/RealisticVillainousGlueware

1
i_thamary 3 Июл 2019 в 22:37

Если вы пытаетесь полностью избежать панд и использовать только словарь, это должно решить

Object = []
totalcost = []
action = []
for i in range(0,3):
    Object.append(data_df['Object'][i])
    totalcost.append(data_df['Cost1'][i]+data_df['Cost2'][i])
    action.append(data_df['Action'][i])
dict2  = {'Object':Object, 'Action':action, 'TotalCost':totalcost} 
1
iampotential 3 Июл 2019 в 23:09