我已经用列表理解更新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
这里的问题是,通过使用
df[rows][cols]
访问方法,您访问的不是原始数据帧值,而是一个副本。在你确实应该收到这样的警告:
详细描述了这种情况here。在
通常,在分配给DataFrame的一个片段时,应该始终使用}。在
.iloc
或{下面是一个示例,说明如何重新编写分配以实际修改数据帧:
^{pr2}$就个人而言,在修改DataFrame的值时,我总是喜欢使用.loc/.iloc,所以我也会重新编写第一个赋值。但这是不必要的,因为不存在视图与副本的问题。在
我建议您使用loc来更新数据帧中的值。在
在你的情况下,你应该使用
就我个人而言,我建议你这样做
^{pr2}$好吧,这个问题。在
但您的代码可以进一步改进,使其更具性能/可读性:
相关问题 更多 >
编程相关推荐