如何从列值中找到数据框的行,然后用字典更新行?

时间:2019-07-07 04:28:18

标签: python-3.x pandas dataframe dictionary

我的数据框的格式为:

import pandas as pd
df = pd.DataFrame(None,columns= ['Name','Age','Asset'])
df = df.append({'Name':'John','Age':10,'Asset':'Bike'},ignore_index=True)
df = df.append({'Name':'Sarah','Age':17,'Asset':'Laptop'},ignore_index=True)
df = df.append({'Name':'Noah','Age':14,'Asset':'Book'},ignore_index=True)
df

    Name    Age     Asset
0   John    10  Bike
1   Sarah   17  Laptop
2   Noah    14  Book

现在,我想读一本字典{'Name' :'John','Age':11,'Asset' :'Phone'},找到名称为John的df行,将age更改为11,并将Asset更改为“ Phone”。假设数据框的每一列都是字典中的键。

由于iloc检索了一行,我认为这行得通,

df.loc[df['Name'] == 'John'] = {'Name' :'John','Age':11,'Asset' :'Phone'}

但是,这不起作用,您需要使用列表进行更新。

用字典更新数据框行的有效方法是什么?

3 个答案:

答案 0 :(得分:1)

我认为您不只是要对John做出更改?但是对于任何字典?

让我们设置您提供的字典

di = {'Name' :'John','Age':11,'Asset' :'Phone'}

然后,我们可以使用.loc按“名称”行进行过滤,并选择“年龄”和“资产”列,然后从字典中设置值。

df.loc[df['Name'] == di['Name'], ['Age', 'Asset']] = [di['Age'], di['Asset']]

print(df)

    Name Age   Asset
0   John  11   Phone
1  Sarah  17  Laptop
2   Noah  14    Book

答案 1 :(得分:1)

您可以将索引设置为“名称”,然后调用df.update()以引用匹配的索引来更新数据框。最后.reset_index()将索引重置为列:

d={'Name' :'John','Age':11,'Asset' :'Phone'}

d_=pd.DataFrame().from_dict(d,'index').T
m_=df.set_index('Name')
m_.update(d_)
df=m_.reset_index()

    Name Age   Asset
0   John  11   Phone
1  Sarah  17  Laptop
2   Noah  14    Book

答案 2 :(得分:1)

您可以将dict.values()直接分配给要由.loc修改的切片,如下所示( 注意 :这适用于Python 3.5+因为插入顺序可以保证d的顺序。在Python <3.5上,您需要使用collections.OrderedDict):

d = {'Name' :'John','Age':11,'Asset' :'Phone'}
df.loc[df.Name.eq(d['Name']), :] = list(d.values())

Out[643]:
    Name Age   Asset
0   John  11   Phone
1  Sarah  17  Laptop
2   Noah  14    Book