两个快速熊猫问题。
我有一个我想要应用过滤器的数据帧列表。
countries = [us, uk, france]
for df in countries:
df = df[(df["Send Date"] > '2016-11-01') & (df["Send Date"] < '2016-11-30')]
当我运行时,df后来不会改变。这是为什么? 如果我循环遍历数据框以创建新列,如下所示,这可以正常工作,并更改列表中的每个df。
for df in countries:
df["Continent"] = "Europe"
作为一个后续问题,我在为不同国家/地区创建数据框列表时发现了一些奇怪的内容。我定义了列表,然后将转换应用于列表中的每个df。在我转换了这些不同的dfs后,我再次调用了列表。我很惊讶地看到列表仍指向未更改的数据帧,我不得不重新定义列表以更新结果。有人可以解释为什么会这样吗?
答案 0 :(得分:3)
看一下this answer,您可以看到for df in countries:
等同于
for idx in range(len(countries)):
df = countries[idx]
# do something with df
显然不会实际修改列表中的任何内容。在这样的循环中迭代它时修改列表通常是不好的做法。
更好的方法是列表理解,你可以尝试像
这样的东西 countries = [us, uk, france]
countries = [df[(df["Send Date"] > '2016-11-01') & (df["Send Date"] < '2016-11-30')]
for df in countries]
请注意,使用这样的列表推导,我们实际上并没有修改原始列表 - 而是创建一个新列表,并将其分配给保存原始列表的变量。
此外,您可能会考虑将所有数据放在一个DataFrame中,并附加一个国家/地区列或其他内容 - Python级别的循环通常较慢,而且DataFrames列表通常不太容易使用单个DataFrame,可以充分利用矢量化的pandas方法。
答案 1 :(得分:0)
为什么
for df in countries:
df["Continent"] = "Europe"
修改国家/地区,而
for df in countries:
df = df[(df["Send Date"] > '2016-11-01') & (df["Send Date"] < '2016-11-30')]
没有,请参阅why should I make a copy of a data frame in pandas。 df是对国家/地区中实际DataFrame的引用,而不是对实际DataFrame本身的引用,但对引用的修改也会影响原始DataFrame。声明新列是一种修改。但是,取一个子集不是一种修改。它只是改变了原始DataFrame中引用的引用。