Python 3.x 如何从列值中找到数据帧的行,然后使用字典更新行?

Python 3.x 如何从列值中找到数据帧的行,然后使用字典更新行?,python-3.x,pandas,dataframe,dictionary,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.a

我有一个如下形式的数据框:

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'。假设dataframe的每一列都是Diciary中的一个键

由于iloc检索到一行,我认为这会起作用

df.loc[df['Name'] == 'John'] = {'Name' :'John','Age':11,'Asset' :'Phone'}
但是,这不起作用,您需要使用列表进行更新


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

我认为您正在尝试对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

您可以将索引设置为Name,然后调用以更新引用匹配索引的数据帧。最后,
.reset_index()
要将索引重置为列,请执行以下操作:

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



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


df.loc[df['Name']='John']=pd.Series({'Name':'John','Age':11,'Asset':'Phone'})
?@QuangHoang使用nan更新Name、Age和Asset是否有办法将字典键与列名匹配,以避免对每个组合进行硬编码?df.append()接受字典,并使用None替换缺少的键值,是否也有类似的方法来更新数据帧?请参见下面的@anky_91,这是更好的答案。这不是很危险吗?因为list(d.values())可能不会按列的顺序提供值?字典的键可以是任意顺序。Python 3.5+保证插入顺序。因此,如果您按照
d={'Name':'John','Age':11,'Asset':'Phone'中的特定顺序创建字典
。保证了
Name->Age->Asset
的顺序。但是,如果您无法控制字典的创建方式,这将不起作用。即使字典键的顺序与df的列名不同,这是否也起作用?@Qwertford只要将
Name
设置为索引,顺序就无关紧要。会的work@Qwertford您还可以尝试使用
pd.concat([d_,df],sort=False)。删除重复项('Name')。重新索引(df.columns,axis=1)
,用于无序的指令
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
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