Как добавить строку в фрейм данных на основе значения фрейма данных и ключа словаря - PullRequest
1 голос
/ 02 мая 2019

У меня есть defaultdict и датафрейм выглядит следующим образом:

[('SERVER01', ['app01', 'app02']), ('SERVER02', ['app03','app04']), ('SERVER03', ['app05', 'app06','app07'])]

dataframe:

Date           Server          Satut          Risk
------------------------------------------------------
01/01/2019     SERVER01         Up             High
08/01/2019     SERVER02         Down           Low
01/02/2019     SERVER03         Up             High
08/02/2019     SERVER01         Down           High
10/02/2019     SERVER01         Up             Low

Я хочу вывод:

Date           Server/app      Satut          Risk
------------------------------------------------------
01/01/2019     SERVER01         Up             High
01/01/2019     app01            Up             High
01/01/2019     app02            Up             High
08/01/2019     SERVER02         Down           Low
08/01/2019     app03            Down           Low
08/01/2019     app04            Down           Low
01/02/2019     SERVER03         Up             High
01/02/2019     app05            Up             High
01/02/2019     app06            Up             High
01/02/2019     app07            Up             High
08/02/2019     SERVER01         Down           High
08/02/2019     app01            Down           High
08/02/2019     app02            Down           High
10/02/2019     SERVER01         Up             Low
10/02/2019     app01            Up             Low
10/02/2019     app02            Up             Low

Итак, я хочусвязать ключ со значением сервера столбцов и продублировать строку, а затем заменить сервер приложением

1 Ответ

1 голос
/ 02 мая 2019

Итак, вот ваш вариант по умолчанию:

d = defaultdict(list,
                {'SERVER01': ['app01', 'app02'],
                 'SERVER02': ['app03', 'app04'],
                 'SERVER03': ['app05', 'app06', 'app07']})

app_df = pd.DataFrame()
for k in d:
    temp_df = pd.DataFrame(d[k], 
                          index=[k] * len(d[k])).reset_index()
    temp_df.columns = ['Server', 'App']
    app_df = pd.concat([app_df, temp_df])

# This will give you the Server and App dataframe
    Server      App
0   SERVER01    app01
1   SERVER01    app02
0   SERVER02    app03
1   SERVER02    app04
0   SERVER03    app05
1   SERVER03    app06
2   SERVER03    app07

И этот код дает вам то, что вам нужно:

# Iterate over the keys of the defaultdict and get the row from the dataframe corresponds to that server
for k in d:
    r = df_raw.loc[df_raw['Server'] == k].to_dict(orient = 'records')[0]

    # Iterate over the apps of that server
    for app in d[k]:
        # make a copy of that row
        new_row = r.copy()
        # Update the Server key value with the app value
        new_row['Server'] = app
        # Convert it to a dataframe
        df_temp = pd.DataFrame.from_dict(new_row, orient='index').T
        # Append it to the main dataframe
        df_raw = df_raw.append(df_temp)

# Merge the two dataframes together
df_raw.merge(app_df, on='Server', how='inner')

который выводит этот фрейм данных:

    Date    Server  Statu    Risk   App
0   1/1/19  SERVER01    Up   High   app01
1   1/1/19  SERVER01    Up   High   app02
2   8/1/19  SERVER02    Down Low    app03
3   8/1/19  SERVER02    Down Low    app04
4   1/2/19  SERVER03    Up   High   app05
5   1/2/19  SERVER03    Up   High   app06
6   1/2/19  SERVER03    Up   High   app07

Возможно, это немного излишне, но это первое, что я придумал, надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...