如何更新PythonPandasDataFrame中特定行中的值?

  • 回答 (2)
  • 关注 (0)
  • 查看 (3646)

在Pandas中有很好的索引方法,我不会以各种方式提取数据。另一方面,我仍然对如何更改现有DataFrame中的数据感到困惑。

在下面的代码中,我有两个DataFrame,我的目标是从第二个df的值更新第一个df中特定行的值。我怎样才能做到这一点?

import pandas as pd
df = pd.DataFrame({'filename' :  ['test0.dat', 'test2.dat'], 
                                  'm': [12, 13], 'n' : [None, None]})
df2 = pd.DataFrame({'filename' :  'test2.dat', 'n':16}, index=[0])

# this overwrites the first row but we want to update the second
# df.update(df2)

# this does not update anything
df.loc[df.filename == 'test2.dat'].update(df2)

print(df)

返回

   filename   m     n
0  test0.dat  12  None
1  test2.dat  13  None

[2 rows x 3 columns]

但我怎样才能做到这一点:

    filename   m     n
0  test0.dat  12  None
1  test2.dat  13  16

[2 rows x 3 columns]
我要飞别拦我我要飞别拦我提问于
f1不如蜗牛回答于
已采纳

首先,pandas使用索引进行更新。当更新命令不更新任何内容时,请检查左侧和右侧。如果由于某种原因,你懒得更新索引来遵循你的识别逻辑,你可以按照

>>> df.loc[df.filename == 'test2.dat', 'n'] = df2[df2.filename == 'test2.dat'].loc[0]['n']
>>> df
Out[331]: 
    filename   m     n
0  test0.dat  12  None
1  test2.dat  13    16

如果你想为整个表做这个,我建议一种我认为比以前提到的方法更好的方法:因为你的标识符被filename设置filename为你的索引,然后update()按你的意愿使用。无论mergeapply()方法包含不必要的开销:

>>> df.set_index('filename', inplace=True)
>>> df2.set_index('filename', inplace=True)
>>> df.update(df2)
>>> df
Out[292]: 
            m     n
filename           
test0.dat  12  None
test2.dat  13    16
猪猪3516347回答于

如果有一个大的dataframe,并且只有几个更新值,那么我将使用以下方式应用:

import pandas as pd

df = pd.DataFrame({'filename' :  ['test0.dat', 'test2.dat'], 
                                  'm': [12, 13], 'n' : [None, None]})

data = {'filename' :  'test2.dat', 'n':16}

def update_vals(row, data=data):
    if row.filename == data['filename']:
        row.n = data['n']
    return row

df.apply(update_vals, axis=1)

扫码关注云+社区

领取腾讯云代金券