1

我正在尝试用仅包含方法中字符串的行替换'let'DataFrame 中的列london(它是 another 的副本) 。代码如下:no_ecocontains()

london = no_eco
london.loc[:,'let'] = london.loc[:,'let'].str.contains('E' or 'D' or 'F' or 'G' or 'H' or 'I' or 'J')
london.loc[:,'let'] = london.loc[:,'let'][london.loc[:,'let']]
london = london.dropna(subset = ['let'])
print(london)

代码有效,我已经删除了不满足字符串的行,但是我收到以下警告:

C:\Users\gerardchurch\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py:543: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas- docs/stable/indexing.html#indexing-view-versus-copy

在查看文档时,我仍然无法理解我做错了什么。

可以继续使用变量london还是我将来会遇到问题?

谢谢。

4

1 回答 1

2

您的代码有几个问题:

  1. london = no_eco不将副本分配给london. 明确:london = no_eco.copy()
  2. pd.Series.str.contains默认支持正则表达式,所以使用str.contains('E|D|F|G|H|I|J|').
  3. 你的逻辑很混乱。您首先将objectdtype 系列替换为布尔系列,然后为其分配一个由自身索引的子集,然后使用dropna专为值设计的子集。

相反,只需构造一个布尔系列并pd.DataFrame.loc与布尔索引一起使用:

london = no_eco.copy()
london = london.loc[london['let'].str.contains('E|D|F|G|H|I|J|')]

对于这种特殊情况,您可以直接使用pd.DataFrame.__getitem__(df[]语法):

london = no_eco.copy()
london = london[london['let'].str.contains('E|D|F|G|H|I|J|')]
于 2018-11-07T14:54:01.317 回答