【问题标题】:How to add row to a dataframe based on a dataframe value and dictionary key如何根据数据框值和字典键向数据框添加行
【发布时间】:2019-05-02 15:37:55
【问题描述】:

我有一个 defaultdict 和一个数据框看起来像:

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

数据框:

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

所以我想将键与列服务器的值链接并复制该行然后用应用程序替换服务器

【问题讨论】:

    标签: python-3.x dataframe dictionary


    【解决方案1】:

    所以这是你的默认字典:

    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
    

    这可能有点矫枉过正,但这是我想出的第一件事,希望对您有所帮助!

    【讨论】:

    • 谢谢它正在工作,但在我的情况下(我忘记了这部分)我可以根据日期多次使用服务器:`日期服务器饱和风险 ---------- -------------------------------------------------------- 01/01/2019 SERVER01 Up High 08/01/2019 SERVER02 Down Low 01/02/2019 SERVER03 Up High 08/02/2019 SERVER01 Down High 12/02/2019 SERVER01 Up Low ` 在这种情况下,使用您的解决方案,找不到与 SERVER01 匹配的其他匹配项.
    • 嗯,明白了。那么为什么不将默认字典转换为数据框并加入列 Server 上的 SERVER 数据框呢?通过这种方式,您将添加另一列,但您也将拥有所有应用程序。这些列将是:日期、服务器、应用程序、状态、风险。我会用一个例子更新我的帖子。
    • @Catapultaa 刚刚编辑了我的答案并提出了一个建议,如果这有更好的帮助,请告诉我!
    • 不幸的是,我无法更改列数,但使用您的代码,我可以用应用程序替换服务器列并将其与原始数据框合并。它应该工作谢谢!
    • 是的,这是真的,很高兴有帮助!
    猜你喜欢
    • 2020-06-23
    • 2020-02-24
    • 2021-12-25
    • 2022-12-18
    • 2021-12-12
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多