2017-01-26 57 views
3

我在Python上學習熊貓,似乎無法完成這個問題。有6個人口專欄,POPESTIMATE2010到2016年的POPESTIMATE,我需要找到這些年間人口變化最大的縣。 (例如,如果5年期間的縣人口是100,120,80,105,100,130,那麼其在期間的最大變化將是| 130-80 | = 50.)發現多個縣的人口差異最大?

我所做的到目前爲止,被管理操作數據到一個數組和列表,但我不知道這是更好的解決這個問題:當我返回數據

import numpy as np 
def answer_seven(): 
    sumlev = census_df.SUMLEV.values == 50 
    data = census_df[['POPESTIMATE2010', 'POPESTIMATE2011','POPESTIMATE2012','POPESTIMATE2013','POPESTIMATE2014','POPESTIMATE2015', 'CTYNAME']].values[sumlev] 
    s = pd.Series(data[:, 0], [data[:, 1], data[:, 2], data[:, 3], data[:, 4], data[:, 5], data[:, 6]], dtype=np.int64) 
return data 
answer_seven() 

輸出:

array([[54660, 55253, 55175, ..., 55290, 55347, 'Autauga County'], 
    [183193, 186659, 190396, ..., 199713, 203709, 'Baldwin County'], 
    [27341, 27226, 27159, ..., 26815, 26489, 'Barbour County'], 
    ..., 
    [21102, 20912, 20989, ..., 20903, 20822, 'Uinta County'], 
    [8545, 8469, 8443, ..., 8316, 8328, 'Washakie County'], 
    [7181, 7114, 7065, ..., 7185, 7234, 'Weston County']], dtype=object) 

而且我列出返回列表時的列表:

55253 55175 55038 55290 55347 Autauga County   54660 
186659 190396 195126 199713 203709 Baldwin County  183193 
27226 27159 26973 26815 26489 Barbour County   27341 
22733 22642 22512 22549 22583 Bibb County   22861 
57711 57776 57734 57658 57673 Blount County   57373 
10629 10606 10628 10829 10696 Bullock County   10887 
20673 20408 20261 20276 20154 Butler County   20944 
117768 117286 116575 115993 115620 Calhoun County  118437 
33993 34075 34153 34052 34123 Chambers County  34098 
26080 26023 26084 25995 25859 Cherokee County  25976 
43739 43697 43795 43921 43943 Chilton County   43665 
13593 13543 13378 13289 13170 Choctaw County   13841 
25570 25144 25116 24847 24675 Clarke County   25767 
13670 13456 13467 13538 13555 Clay County   13880 
14971 14921 15028 15072 15018 Cleburne County  14973 
50448 51173 50755 50831 51211 Coffee County   50177 
54443 54472 54471 54480 54354 Colbert County   54514 
13121 12996 12875 12662 12672 Conecuh County   13208 
11348 11195 11059 10807 10724 Coosa County   11758 
38060 37818 37830 37888 37835 Covington County  37796 
13896 13951 13932 13948 13963 Crenshaw County  13853 
80469 80374 80756 81221 82005 Cullman County   80473 
50109 50324 49833 49501 49565 Dale County   50358 
43178 42777 42021 41662 41131 Dallas County   43803 
71387 70942 70869 71012 71130 DeKalb County   71142 
80012 80432 80883 81022 81468 Elmore County   79465 
38213 38034 37857 37784 37789 Escambia County  38309 
104236 104235 103852 103452 103057 Etowah County   104442 
17062 16960 16857 16842 16759 Fayette County   17231 
31729 31648 31507 31592 31696 Franklin County  31734 
                   ... 

我看了多個論壇帖子,但我找不到真正與此相關的任何內容。我知道最好的辦法是創建一個「最高」列和一個「最低」列,然後找到差異最大的縣,但我不知道如何在一個區域內找到最大/最小值陣列。真的很感謝幫助!

回答

0

這是我的天真實施。

maxchange = (None,0) 
for row in data: 
    low = min(row[:-1]) 
    high = max(row[:-1]) 
    if high-low > maxchange[1]: 
     maxchange = (row[-1], high-low) 
print(maxchange) 

這使用在answer_seven創建的data陣列。這隻需找到每個縣的最小值和最大值,並找出各縣之間的最大差異。

+0

感謝您的幫助,但是我得到的代碼錯誤是在分配之前引用的'局部變量'maxchange'。希望能夠幫助你如何將你的代碼整合到工作 –

+0

對不起,忘了複製'maxchange'的初始化。我已經更新了。 – FamousJameous

0

試試這個:

def df_max_dif (x): 

    max_dif = 0 

    for ind in x.index: 

     max_value = np.max(np.abs(x-x.loc[ind])) 

     if max_value > max_dif: 

      max_dif = max_value 

    return max_dif 

df['max_dif'] = np.nan 

for indx in df.index: 

    df.loc[indx,'max_dif'] = df_max_dif(df.loc[indx].drop('max_dif')) 

希望它能幫助!

+0

感謝您的幫助,但我得到的錯誤遍佈各地。你能否進一步解釋我如何整合你的代碼?我一直得到'不受支持的操作數類型的str和int' –

+0

這個錯誤意味着你想用一個不可能的字符串操作,很可能是np.max()或者x-x.loc [ind]。你必須做的是修正它只傳遞數值的列。 – epattaro

+0

我該怎麼做? –

1

如果你有一個熊貓數據幀開始與您的數據,然後使用熊貓分鐘()和max()方法:

>>> df1 
year: 2010 2011 2012 2013 2014 
city      
abilene 47000 2000 31000 72000 47000 
boise 44000 55000 68000 17000 63000 
calgary 39000 86000 6000 97000 1000 
denver 57000 52000 46000 0  43000 

>>> df1.T.max()-df1.T.min() 
city 
abilene 70000 
boise  51000 
calgary 96000 
denver  57000 
dtype: int32 
+0

這給了我整個集合中最高的數字減去整個集合中最低的數字。我需要找出每行最高的數字減去每行最低的數字,然後找出差異最大的縣名。謝謝澄清 –

+0

使用s =(df.T.max() - df.T.min())。sort_values(ascending = False) s.name ='diff' s.reset_index()。ix [0 ]'查找答案中的代碼返回的Series中的最大值。 – dotcs

+0

謝謝澄清。我進入,現在我得到'錯誤無效的語法'? –

1

給你所提到的數據(僅限於短短的幾行用於演示目的)首先讓我們將其轉化爲正確的數據幀:

from io import StringIO 

dataset = """\ 
55253 55175 55038 55290 55347 Autauga County   54660 
186659 190396 195126 199713 203709 Baldwin County  183193 
27226 27159 26973 26815 26489 Barbour County   27341 
22733 22642 22512 22549 22583 Bibb County   22861 
57711 57776 57734 57658 57673 Blount County   57373 
""" 

df = pd.DataFrame.from_csv(StringIO(dataset), sep='\s{2,}', header=None).reset_index() 
df.columns = ['y1', 'y2', 'y3', 'y4', 'y5', 'name', 'y6'] 
df = df.set_index('name') 
df.head() 

       y1  y2  y3  y4  y5  y6 
name       
Autauga County 55253 55175 55038 55290 55347 54660 
Baldwin County 186659 190396 195126 199713 203709 183193 
Barbour County 27226 27159 26973 26815 26489 27341 
Bibb County  22733 22642 22512 22549 22583 22861 
Blount County 57711 57776 57734 57658 57673 57373 

然後你可以使用numpy的的minmax方法,在數據集內計算最大值和最小值。之後,您可以創建一個由最大差異組成的新DataFrame。無需python中的任何循環,與熊貓或numpy中的優化方法相比,速度較慢。

df2 = DataFrame((np.max(df.values, axis=1) - np.min(df.values, axis=1)), index=df.index, columns=['largest_diff']) 
df2.head() 

       largest_diff 
name  
Autauga County 687 
Baldwin County 20516 
Barbour County 852 
Bibb County  349 
Blount County 403 
+0

數據集長達數百行,我不能簡單地複製並粘貼它。感謝您的幫助 - 如果您可以詳細說明如何將代碼集成到我編寫的任何代碼中以使其工作,我將非常感激。當我嘗試使用你放的東西時,我得到'numpy.ndarray'對象沒有屬性'set_index' –

+0

你不應該使用StringIO。這只是爲了演示目的,以顯示如何使用熊貓['from_csv'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_csv.html)方法。請參閱文檔。 'path'參數可以是字符串文件路徑或文件句柄/ StringIO,因此不需要在實際的實現中複製和粘貼。 'from_csv'也返回一個DataFrame實例,不包含'numpy.ndarray'。正因爲如此,'set_index'被定義如果使用這個方法。 – dotcs