2017-01-23 70 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中引用的內容。