循环遍历一个pandas数据帧列表

时间:2017-01-23 17:51:29

标签: python list pandas

两个快速熊猫问题。

  1. 我有一个我想要应用过滤器的数据帧列表。

    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"
    
  2. 作为一个后续问题,我在为不同国家/地区创建数据框列表时发现了一些奇怪的内容。我定义了列表,然后将转换应用于列表中的每个df。在我转换了这些不同的dfs后,我再次调用了列表。我很惊讶地看到列表仍指向未更改的数据帧,我不得不重新定义列表以更新结果。有人可以解释为什么会这样吗?

2 个答案:

答案 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中引用的引用。