2017-08-31 69 views
2
系列
In the folwwing code: 
import pandas as pd 
import sqlite3 
import math 
import numpy 
con = sqlite3.connect(r'C:\Python34\factbook.db') 
facts = pd.read_sql_query('select * from facts;', con) 
facts.dropna(inplace=True) 
facts = facts[facts['area_land']!=0][:] 
facts = facts[facts['population']!=0][:] 
facts.reset_index(drop=True, inplace=True) 
def pop_50(name): 
    pop = facts[facts['name'] == name]['population'] 
    perc = facts[facts['name'] == name]['population_growth'] 
    new_pop = pop*(math.e**(35*perc)) 
    return new_pop 


x=pd.Series(data=facts['name']) 
z = x.apply(pop_50) 

x是一個系列:適用()返回一個數據幀,而不是

0          Afghanistan 
1           Albania 
2           Algeria 
3           Andorra 
4            Angola 
5        Antigua and Barbuda 
6           Argentina 
7           Armenia 

等等...

但是z是不是。這裏是一個鏈接,看看它是什麼(一個數據幀): https://www.scribd.com/document/357697929/Doc1

我不明白爲什麼。 pop_50函數返回單個結果(我測試過),那麼爲什麼需要一個DataFrame呢? pop_50如何返回一個系列?它需要一行(where facts ['name'] == name),並從中獲得一個值(在人口列下),而不是稱之爲彈出。它比perc做同樣的想法。 new_pop是2個singel值的數學組合,所以它也是一個單一的值,func只是返回值,不是嗎?

謝謝。

+0

你可以發佈'z'的一些內容嗎?在我的測試中,它是一個熊貓系列對象。 – James

+0

這是因爲你的返回值'new_pop'是一個系列。嘗試返回一個整數。像'new_pop.population.values [0]'。 –

回答

1

pop_50返回pd.Seriesx.apply(pop_50)x的每一行調用函數pop_50,並將該行的值作爲參數name傳遞給pop_50。因此,對於x中的第一行,您將返回一個系列。並再次爲第二行。你最終得到一系列系列......這是一個數據框。此外,x的索引將成爲您的結果列。

試試這個:

facts2 = facts.set_index('name') 

def pop_50(name): 

    pop = facts2.at[name, 'population'] 
    perc = facts2.at[name, 'population_growth'] 
    new_pop = pop*(math.e**(35*perc)) 
    return new_pop 

您還可以使用pd.Series.squeeze

def pop_50(name): 
    pop = facts[facts['name'] == name]['population'].squeeze() 
    perc = facts[facts['name'] == name]['population_growth'].squeeze() 
    new_pop = pop*(math.e**(35*perc)) 
    return new_pop 

如果因任何原因,你不能改變pop_50,在lambda

把它包
z = x.apply(lambda name: pop_50(name).squeeze()) 
+0

但是pop_50如何返回一個系列?它需要一行(where facts ['name'] == name),並從中獲得一個值(在人口列下),而不是稱之爲彈出。它比perc做同樣的想法。 new_pop是2個singel值的數學組合,所以它也是一個單一的值,func只是返回值,不是嗎? –

+0

'facts ['name'] == name'是一個布爾序列。事實[事實['名稱'] ==名稱]是一個系列,即使它是一個長度。首先是 – piRSquared

+0

- 謝謝!因爲你可以在這裏看到:https://www.scribd.com/document/357700959/Doc2,pop正在從事實df和perc中獲取單個值。問題不在功能 - 我測試它,它的工作原理。它的apply()函數給pop_50一次排除了一個單一值的整行,但我不知道它爲什麼會這樣做,因爲我在一個系列中使用它。 –

相關問題