【发布时间】:2021-11-20 23:18:52
【问题描述】:
在 Pandas 中,我尝试按日期过滤 DataFrame,然后从较长的字符串中提取 reportId 字符串(即短划线之间的 6 位数字);但是,当我运行以下代码时,会收到警告:
SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value
list_date = [1632309961, 1632310980, 1632311134, 1632411137,
1632411139, 1632411142, 1632411144, 1632411146,
1632413166, 1632413427]
list_id = ['se-84c735-hg5675', 'se-5f73s9-hg3465', 'se-1f34g6-hg3455', 'se-09f67s-hg5123',
'se-5g63g9-hg1235', 'se-47h8h0-hg5555', 'se-h901h3-hg6755', 'se-287n54-hg5321',
'se-g357a8-hg6675', 'se-56q89r-hg5767']
df = pd.DataFrame([list_date, list_id], index=['date_unix','id']).T
def test_extract(df):
df['date'] = pd.to_datetime(df['date_unix'], unit='s')
df = df[df['date'] >= pd.to_datetime('2021-09-23')]
df['reportId'] = df['id'].str.extract(r"([a-zA-Z0-9]{6})")
return df
test_extract(df)
我尝试了一些不同的修复方法,例如使用 .loc[row_indexer,col_indexer] 制作日期过滤器或在所有内容之后抛出 .copy();但是,我遇到了同样的问题:
def test_extract(df):
df['date'] = pd.to_datetime(df['date_unix'], unit='s')
df = df.loc[df['date'] >= pd.to_datetime('2021-09-23'),:]
df['reportId'] = df['id'].str.extract(r"([a-zA-Z0-9]{6})")
return df
奇怪的是,当我在函数之外运行相同的代码时,我不再收到警告。当代码在函数中时,谁能为我提供避免此警告的解决方案?
信息: 熊猫 - 0.23.4 :: Python 3.7.10 :: 操作系统 - Linux(Ubuntu 16.04.7 LTS)
【问题讨论】: