Python 3.x 如何基于dataframe值和字典键向dataframe添加行

Python 3.x 如何基于dataframe值和字典键向dataframe添加行,python-3.x,dataframe,dictionary,Python 3.x,Dataframe,Dictionary,我有一个defaultdict和一个数据帧,看起来像: [('SERVER01', ['app01', 'app02']), ('SERVER02', ['app03','app04']), ('SERVER03', ['app05', 'app06','app07'])] 数据帧: Date Server Satut Risk ------------------------------------------------------

我有一个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

因此,我想将该键与列服务器的值链接,并复制该行,然后将服务器替换为应用程序,这是您的defaultdict:

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

这可能有点过分,但这是我想到的第一件事,希望它能有所帮助

谢谢你,这是工作,但在我的情况下(我忘记了这一部分)根据日期的不同,我可以使用服务器多次:`日期服务器状态风险----------------------------------------------2019年1月1日服务器01向上高2019年1月8日服务器02向下低2019年2月1日服务器03向上高2019年2月8日服务器01处于高位2019年2月12日SERVER01处于低位`在这种情况下,使用您的解决方案,找不到与SERVER01匹配的其他项。嗯,明白了。所以,为什么不将默认dict转换为数据帧,并加入column SERVER上的服务器数据帧呢?这样,您将添加另一列,但您也将拥有所有应用程序。列将是:日期、服务器、应用程序、状态、风险。我会用一个例子来更新我的帖子。@Catapultaa刚刚用一个建议编辑了我的答案,请告诉我这是否有帮助!不幸的是,我无法更改列数,但通过您的代码,我可以用应用程序替换服务器列,并将其与原始数据帧合并。应该有用的,谢谢!是的,那是真的,很高兴这有帮助!