更新 pandas DataFrame 的特定行的单元格

ElB*_*ulP 5 python dataframe pandas

我想更新 pandas 的一行中的一些单元格DataFrame,我正在update这样做,但它总是只修改第一个索引,这是一个例子:

df = pd.DataFrame(data={'cod':[1000,1001], 'B': ['b1','b2'], 'C':['c1','c2']})
updated_data = pd.DataFrame({'cod':[1001], 'C':['newC1']})
updated_data2 = pd.DataFrame({'cod':[1000], 'B':['newB1']})
df.update(updated_data)
df.update(updated_data2)
Run Code Online (Sandbox Code Playgroud)

执行此代码后,df 将具有:

      cod      B      C
0  1000.0  newB1  newC1
1  1001.0     b2     c2
Run Code Online (Sandbox Code Playgroud)

应该在什么时候

         cod      B      C
cod                       
1000  1000.0  newB1     c1
1001  1001.0     b2  newC1
Run Code Online (Sandbox Code Playgroud)

为了实现,我编写了以下代码,但不知道这是否是最好的方法:

df = pd.DataFrame(data={'cod':[1000,1001], 'B': ['b1','b2'], 'C':['c1','c2']})
df = df.set_index(df.cod)
updated_data = pd.DataFrame({'cod':[1001], 'C':['newC1']})
updated_data = updated_data.set_index(updated_data.cod)
df.update(updated_data, overwrite=True)
updated_data = pd.DataFrame({'cod':[1000], 'B':['newB1']})
updated_data = updated_data.set_index(updated_data.cod)
df.update(updated_data, overwrite=True)
Run Code Online (Sandbox Code Playgroud)

在我看来,对于简单的事情来说它非常冗长,还有其他方法吗?

更新

这是实际的代码,而不是有两个updated_data,实际上是在一个循环内:

df = pd.DataFrame(data={'cod':[1000,1001], 'B': ['b1','b2'], 'C':['c1','c2']})
df = df.set_index(df.cod)
for i in (1000,1001):
    updated_data = pd.DataFrame({'cod':[i], 'C':['newC1']})
    updated_data = updated_data.set_index(updated_data.cod)
    df.update(updated_data, overwrite=True)
Run Code Online (Sandbox Code Playgroud)

Dmy*_*tro 4

在你的情况下,你可以简单地使用:

df.loc[df.cod == 1001, 'C'] = 'newC1'
df.loc[df.cod == 1000, 'B'] = 'newB1'
Run Code Online (Sandbox Code Playgroud)

为了加快速度,最好设置索引:

df = df.set_index(df.cod)
df.loc[df.index == 1001, 'C'] = 'newC1'
df.loc[df.index == 1000, 'B'] = 'newB1'
Run Code Online (Sandbox Code Playgroud)

您可以使用列列表:

df.loc[df.index == 1001, ['C', 'B']] = ['newC', 'newB']
Run Code Online (Sandbox Code Playgroud)