使用理解更新数据帧列

2024-05-15 11:02:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用列表理解更新dataframe列一段时间了,没有问题。 如果我在dataframe上有一个过滤器,这会产生问题,列不会更新,即使理解返回正确的值。 下面是一个人为的例子,纯粹是为了说明这个问题。在

如果填充了Region,我首先将Town列更新为与Region相同。 然后我尝试在地址中找到Town的值,如果它还没有被填充。问题是第二个update语句不起作用。在

很明显,我对理解力的理解是不够的,所以请给我指点我做错了什么。 谢谢!在

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import math
import pyodbc

#create dataframe

data = [{'Address': '123 Fake st, someTown, Nebraska', 'Region':'nebraska', 'metric1':50,'Town':''},
    {'Address': '2345 Fake st, someTown, Nebraska', 'Region':'nebraska', 'metric1':50,'Town':''},
    {'Address': '43 Fake st, someTown, Nebraska', 'Region':'nebraska', 'metric1':50,'Town':''},
    {'Address': '1 Fake st, someTown, Nebraska', 'Region':'nebraska', 'metric1':50,'Town':''},
    {'Address': '43 Fake st, someTown, NOBraska', 'Region':'', 'metric1':50,'Town':''},
    {'Address': '6 Fake st, someTown, NOBraska', 'Region':'', 'metric1':50,'Town':''},
    {'Address': '45 Fake st, someTown, NOBraska', 'Region':'', 'metric1':50,'Town':''},]

dataset = pd.DataFrame(data)

#set Town column to the region.
dataset['Town'] = [r for r in dataset['Region']]

#if Town column is still blank, find the region in the Address, correcting for a known bad spelling
dataset[dataset['Town'] =='']['Town']  =  ['Nebraska' if sub.split(",")[2].strip() =='NOBraska' else sub.split(",")[2].strip() for sub in dataset[dataset['Town'] =='']['Address'].astype(str)]  

#RESULT: dataset['Town'] is not updated for the case when it is empty are not updated

Tags: theimportdataframeforaddressdatasetregionfake
3条回答

这里的问题是,通过使用df[rows][cols]访问方法,您访问的不是原始数据帧值,而是一个副本。在

你确实应该收到这样的警告:

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

详细描述了这种情况here。在

通常,在分配给DataFrame的一个片段时,应该始终使用.iloc或{}。在

下面是一个示例,说明如何重新编写分配以实际修改数据帧:

^{pr2}$

就个人而言,在修改DataFrame的值时,我总是喜欢使用.loc/.iloc,所以我也会重新编写第一个赋值。但这是不必要的,因为不存在视图与副本的问题。在

dataset.loc[:, 'Town'] = [r for r in dataset['Region']]

我建议您使用loc来更新数据帧中的值。在

在你的情况下,你应该使用

dataset.loc[dataset['Town'] =='', 'Town'] = ['Nebraska' if sub.split(",")[2].strip() =='NOBraska' else sub.split(",")[2].strip() for sub in dataset[dataset['Town'] =='']['Address'].astype(str)]

就我个人而言,我建议你这样做

^{pr2}$

好吧,这个问题。在

但您的代码可以进一步改进,使其更具性能/可读性:

def replacer(sub):
    x = sub.split(',')[2].strip()
    return 'Nebraska' if x == 'NOBaska' else x

dataset.loc[dataset['Town'] == '', 'Town']  =  \
dataset.loc[dataset['Town'] == '', 'Address'].astype(str).apply(replacer)

相关问题 更多 >