首页 > 解决方案 > Pandas:.loc 没有将一个数据帧的行分配给另一个数据帧的切片行

问题描述

我有一个如下的数据框,我从中获取一个名为NDCSPart_dfusingNDCSPart_df = Register_df.iloc[:, :17]

寄存器_df

NDCSPart_df需要由NOTES_df具有相同列长度但一些具有不同值以及相同或更多行数的最新数据帧来更新。

我比较了一行NDCSPart_dfNOTES_df使用“MainDocID”来识别任何更改,如果有任何更改,则将为 in 中的行NDCSPart_df分配具有相同“MainDocID”的行的值NOTES_df在此处输入图像描述

for i in ChangedDocumentIDDict.keys():    
    NDCSPart_df.loc[NDCSPart_df["MainDocID"]==i,:].update(NOTES_df.loc[NOTES_df["MainDocID"]==i,:])

这给了我以下警告,

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:5516: SettingWithCopyWarning: 试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self[col] = expressions.where(mask, this, that)

同样,我尝试了以下代码:

for i in ChangedDocumentIDDict.keys():
        NDCSPart_df.loc[NDCSPart_df["MainDocID"]==i,:]= NOTES_df.loc[NOTES_df["MainDocID"]==i,:]

有类似的警告:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:190: SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置值

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self._setitem_with_indexer(indexer, value) C:\ProgramData\Anaconda3\lib \site-packages\ipykernel_launcher.py:3:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

请参阅文档中的警告:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 这与 ipykernel 包是分开的,因此我们可以避免导入,直到

但我担心的是赋值失败并NaN填充了值,这些值应该具有针对索引 78 的行的值,NOTES_df如第二个快照所示。

在此处输入图像描述

我正在使用 Python 3.7.3、pandas 0.24.2,并且我尝试过 Python 3.6.6、pandas 0.23.4,结果相同。

我的问题是:

  1. 我如何错误地使用 .loc?
  2. 如何分配 to 的NOTES_dfNDCSPart_df

标签: pythonpandasdataframe

解决方案


这更像是index条件不同的过滤器后的两个df,所以我们需要添加.values更多信息

for i in ChangedDocumentIDDict.keys():
        NDCSPart_df.loc[NDCSPart_df["MainDocID"]==i,:]= NOTES_df.loc[NOTES_df["MainDocID"]==i,:].values

推荐阅读