2017-01-26 5 views
3

私はPythonでパンダを学んでいますが、この問題を終わらせることはできません。 POPESTIMATE2010からPOPESTIMATE2016までの6つの人口列があり、これらの年の間に人口の変化が最も大きい郡を探す必要があります。 (例えば、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())を使用してください。 ]を使用して、回答内のコードによって返される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内でpandasや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

関連する問題