Python 3.x 如何基于dataframe值和字典键向dataframe添加行
我有一个defaultdict和一个数据帧,看起来像: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 ------------------------------------------------------
[('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刚刚用一个建议编辑了我的答案,请告诉我这是否有帮助!不幸的是,我无法更改列数,但通过您的代码,我可以用应用程序替换服务器列,并将其与原始数据帧合并。应该有用的,谢谢!是的,那是真的,很高兴这有帮助!