Python/Pandas:如何将2列分成单独的记录?
我有宠物小精灵的统计的数据框(这是头的外观): Python/Pandas:如何将2列分成单独的记录?
我希望能够使基于口袋妖怪类型的分析。我遇到的问题是有一个type_1和一个type_2列。如果它是type_1或type_2,我有兴趣通过键入irregardless来查看总的统计信息。我将如何去解决这个问题?我的猜测是,我将不得不为每个pokemon创建第二行,并将type_2作为type,并将原始记录的type_1更改为type。我如何去熊猫做这件事?
编辑:什么,我会感兴趣的一个例子输出是这样的:
草:平均马力:300,平均攻击力:50,平均防御:60 ....
毒:平均马力:308 ,平均攻击:60,平均防御:40 ..
...
考虑数据框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
谢谢!我现在试图单独获取这些数据(查看某些统计数据的最高,最低等)。为此,我需要一个所有类型的列表。我用你的代码如下:https://gist.github.com/anonymous/2e03d51aad4fdf666744b2401982bdd8,并注意到融化给了NaN一些价值。是否有这个原因,我该如何解决? –
@TylerHilbert这当然有一个原因。我不知道究竟是什么原因,没有看到“NaN”数据的确切位置。如果您提供了一个能够演示问题并提出新问题的最简单示例,那最好。 – piRSquared
所以我觉得@ 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"])
有19种不同的类型。有没有办法让每次都自动化,而不是硬编码呢? –
也许吧。就像@piRSquared说的那样,我们需要看到你期望输出结果的例子。 – Batman
好吧,我的编辑现在有意义吗? –
的方法有很多,太多的方法!如果您提供了一个您期望的最终输出结果的例子,那么您会得到更好的服务。 – piRSquared
我编辑了这个问题,现在有意义吗? –