2017-01-23 46 views
3

为您提供两个快速熊猫问题。通过熊猫数据框列表循环播放

  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. 作为后续行动的问题,我发现了一些奇怪,当我创建dataframes针对不同的国家名单。我定义了列表,然后将转换应用于列表中的每个df。在我转换了这些不同的dfs之后,我再次调用了这个列表。我很惊讶地发现列表仍然指向未改变的数据框,我不得不重新定义列表来更新结果。任何人都可以阐明这是为什么?

回答

2

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,它可以充分利用矢量化熊猫方法。

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