2017-04-09 7 views
0

私は(これは頭が見えるものである)ポケモンの統計情報のデータフレームを持っている: enter image description herePython/Pandas:2列を別々のレコードに分割する方法は?

私はポケモンのタイプに基づいて分析を行うことができるようにしたいです。私が持っている問題は、type_1とtype_2の列があるということです。私はtype_1またはtype_2であれば、タイプ別に合計統計量を調べることに興味があります。私はこれをどうやって解決しますか?私の推測では、各ポケモンの2番目の行をtype_2として作成し、元のレコードのtype_1をタイプする必要があるということです。パンダでこれをどうやってやるの?

編集:
草:平均馬力:300、平均攻撃:50、平均防御:私は興味があるものの例の出力は次のようである60 ....
毒:平均馬力:308 、平均攻撃:60、平均防衛:40 ..
...

+0

多くの方法、あまりにも多くの方法があります!最終的な出力がどのように表示されるかの例が提供されれば、より良い結果が得られます。 – piRSquared

+0

質問を編集しましたが、それは今意味がありますか? –

答えて

3

は、データフレームdf

df = pd.DataFrame([ 
     ['Fire', 'Poison', 300, 30, 10], 
     ['Poison', 'Grass', 250, 20, 15] 
    ], columns=['Type1', 'Type2', 'HP', 'Attack', 'Defense']) 

    Type1 Type2 HP Attack Defense 
0 Fire Poison 300  30  10 
1 Poison Grass 250  20  15 

使用pd.melt

stat_cols = ['HP', 'Attack', 'Defense'] 
type_cols = ['Type1', 'Type2'] 
melted = pd.melt(df, stat_cols, type_cols, value_name='Type') 
melted.groupby('Type')[stat_cols].mean() 

      HP Attack Defense 
Type       
Fire 300.0 30.0  10.0 
Grass 250.0 20.0  15.0 
Poison 275.0 25.0  12.5 

余分なクレジット
を考えてみましょう 使用describe

stat_cols = ['HP', 'Attack', 'Defense'] 
type_cols = ['Type1', 'Type2'] 
melted = pd.melt(df, stat_cols, type_cols, value_name='Type') 
melted.groupby('Type')[stat_cols].describe() 


         HP  Attack Defense 
Type           
Fire count 1.000000 1.000000 1.000000 
     mean 300.000000 30.000000 10.000000 
     std   NaN  NaN  NaN 
     min 300.000000 30.000000 10.000000 
     25% 300.000000 30.000000 10.000000 
     50% 300.000000 30.000000 10.000000 
     75% 300.000000 30.000000 10.000000 
     max 300.000000 30.000000 10.000000 
Grass count 1.000000 1.000000 1.000000 
     mean 250.000000 20.000000 15.000000 
     std   NaN  NaN  NaN 
     min 250.000000 20.000000 15.000000 
     25% 250.000000 20.000000 15.000000 
     50% 250.000000 20.000000 15.000000 
     75% 250.000000 20.000000 15.000000 
     max 250.000000 20.000000 15.000000 
Poison count 2.000000 2.000000 2.000000 
     mean 275.000000 25.000000 12.500000 
     std  35.355339 7.071068 3.535534 
     min 250.000000 20.000000 10.000000 
     25% 262.500000 22.500000 11.250000 
     50% 275.000000 25.000000 12.500000 
     75% 287.500000 27.500000 13.750000 
     max 300.000000 30.000000 15.000000 
+0

ありがとう!私は今、個別のデータを(特定の統計情報の最高値、最低値などを見るために)個別に取得しようとしています。これを行うには、すべてのタイプのリストが必要です。私はコードを次のように使っています:https://gist.github.com/anonymous/2e03d51aad4fdf666744b2401982bdd8そして溶融していくつかの値に対してNaNを与えていたことがわかりました。これには理由があり、それをどうやって修正するのですか? –

+0

@TylerHilbert確かにこれが理由です。私はその理由が、NaNデータがどこにあるのかを正確に見ることなく、わからない。問題を実証し、新しい質問をするための最小限の例を提供した方がよいでしょう。 – piRSquared

0

だから、@ piRSquared'sは優れていると思います。あなたは出力がが正確にあなたの質問に見えるようにしたい場合は、これを試してみてください。

types = set(df["Type_1]) 
types.add(df["Type_2]) 
data_columns = ["HP, "Attack", "Defense"] 
for type_ in types: 
    avgs = df[(df["Type_1"]==type_) | (df["Type_2"]==type_)][data_columns].mean() 
    response = """{type}: Average Hp: {hp}, Average Attack: {attack}, 
       Average Defense: {defense}""".format(type=type_, hp=avg["HP"], 
                attack=avg["Attack], 
                defense=avg["Defense"]) 
+0

19種類があります。ハードコードするのではなく、毎回それを自動化する方法はありますか?おそらく、 –

+0

。 @piRSquaredのように、出力を見たいと思うものの例を見る必要があります。 – Batman

+0

私の編集は今や理にかなっていますか? –

関連する問題