循环遍历熊猫数据框列表

Posted

技术标签:

【中文标题】循环遍历熊猫数据框列表【英文标题】:Looping through a list of pandas dataframes 【发布时间】:2017-06-08 07:54:44 【问题描述】:

给你的两个小熊猫问题。

    我有一个要应用过滤器的数据框列表。

    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 之后,我再次调用了该列表。我惊讶地发现列表仍然指向未更改的数据框,我不得不重新定义列表以更新结果。任何人都可以解释为什么会这样吗?

【问题讨论】:

【参考方案1】:

看一下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 级别的循环通常较慢,并且使用 DataFrame 列表通常比使用单个 DataFrame,它可以充分利用矢量化的 pandas 方法。

【讨论】:

【参考方案2】:

为什么

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 中引用所指的内容。

【讨论】:

以上是关于循环遍历熊猫数据框列表的主要内容,如果未能解决你的问题,请参考以下文章

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

从列表中遍历熊猫数据框

循环遍历熊猫中的行[重复]

如何循环遍历熊猫分组的时间序列?

循环遍历数据框列表时功能不起作用

循环遍历数据框列后如何附加列表?