2017-04-09 68 views
0

我有宠物小精灵的统计的数据框(这是头的外观): enter image description herePython/Pandas:如何将2列分成单独的记录?

我希望能够使基于口袋妖怪类型的分析。我遇到的问题是有一个type_1和一个type_2列。如果它是type_1或type_2,我有兴趣通过键入irregardless来查看总的统计信息。我将如何去解决这个问题?我的猜测是,我将不得不为每个pokemon创建第二行,并将type_2作为type,并将原始记录的type_1更改为type。我如何去熊猫做这件事?

编辑:什么,我会感兴趣的一个例子输出是这样的:
草:平均马力: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的非常出色。如果您所要的输出看起来就像你的问题虽然,试试这个:

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

好吧,我的编辑现在有意义吗? –