将键值字典对应用于数据帧中的多个列

2024-09-18 01:40:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在两列中应用对当前数据帧的更改,其中一列的字典键和来自dict的每一个值的另一列的值。我找不到任何方法来为例如这样做

dict is - test = {'a':32, 'b':21, 'c':92}

当前数据帧看起来像

date         env   result         cost

2021-03-01   dev      gcp.dev.a         30
2021-03-01   prd      gcp.prd.d         35
2021-03-01   dev      gcp.dev.j         98
2021-03-01   sandbox  gcp.sandbox.b     94

从字典中添加对结果和成本列的更改后,dataframe应如下所示-

date         env        result          cost

2021-03-01   dev      gcp.dev.a           30
2021-03-01   prd      gcp.prd.d           35
2021-03-01   dev      gcp.dev.j           98
2021-03-01   sandbox  gcp.sandbox.b       94
2021-03-01   dev      gcp.dev.a           32 
2021-03-01   prd      gcp.prd.b           21  
2021-03-01   prd     gcp.prd.c          92

这里gcp是一个固定值,它被添加,dev和prd来自env列

在上面,您注意到最后3行是通过获取测试字典键值添加的,每个键值都添加在结果和成本中。i、 e每个键值对的两列中都应添加相关行


Tags: 数据方法devenvdate字典isresult
3条回答

通过协构造函数创建新的数据帧,并通过^{},最后一次正向填充date值将其添加到原始数据帧:

test  = {'a':32, 'b':21, 'c':92}

df1 = pd.DataFrame(list(test.items()), columns=['result','cost'])

df = pd.concat([df, df1], ignore_index=True)
df['date'] = df['date'].ffill()
print (df)
         date result  cost
0  2021-03-01      a    30
1  2021-03-01      d    35
2  2021-03-01      j    98
3  2021-03-01      b    94
4  2021-03-01      a    32
5  2021-03-01      b    21
6  2021-03-01      c    92

环路解决方案是可行的,但速度较慢,因此不建议:

for k, v in test.items():
    df.loc[len(df), ['result','cost']] = (k, v)

df['date'] = df['date'].ffill()

您也可以通过使用pd.DateFrame.from_dict()方法、append()方法和ffill()方法来实现这一点:

test = {'a':32, 'b':21, 'c':92}

newdf=pd.DataFrame(test.values(),index=test.keys(),columns=['cost']).reset_index()
    #OR(use any one of them to create dataframe named newdf)
newdf=pd.DataFrame.from_dict(test,orient='index',columns=['cost']).reset_index().rename(columns={'index':'result'})

最后:

newdf=df.append(newdf,ignore_index=True).ffill()

现在,如果您打印newdf,您将获得所需的输出:

    date         result     cost
0   2021-03-01      a       30
1   2021-03-01      d       35
2   2021-03-01      j       98
3   2021-03-01      b       94
4   2021-03-01      a       32
5   2021-03-01      b       21
6   2021-03-01      c       92

resultcost设置为索引:

temp = df.set_index(['result', 'cost']) 

从字典生成MultiIndex

test_index = pd.MultiIndex.from_tuples(test.items(), names = ['result', 'cost'])

temp的索引和test_index的并集重新索引temp

(temp
 .reindex(temp.index.union(test_index, sort = False))
 .ffill() 
 .reset_index()
 .reindex(columns = df.columns)
 )
 
         date result  cost
0  2021-03-01      a    30
1  2021-03-01      d    35
2  2021-03-01      j    98
3  2021-03-01      b    94
4  2021-03-01      a    32
5  2021-03-01      b    21
6  2021-03-01      c    92

相关问题 更多 >