熊猫:计算特定列

时间:2020-01-19 19:36:35

标签: python pandas

我有一个来自excel文件的简化数据框

                   Team                   match1                game12                  match3
1            Sandhausen                   2                     3                       1
2              Pohlheim                   1                     1                       6
3            Völklingen                   4                     2                       4
4  Nieder-Olm/Wörrstadt                   5                     7                       2
5             Nümbrecht                   7                     6                       3
6               Dorheim                   3                     4                       7
7        Nienburg/Weser                   6                     5                       5
8           Bad Homburg                   8                     8                       8
9           Bad Homburg                   9                     9                       9

我想计算出最好的球队。 比赛数据代表球队的位置。 要计算最佳团队,1.位置获得9分2.位置获得8分,依此类推。 这适用于所有比赛。

我的问题是match1可能是一个完全不同的名称,是否可以使用索引?

更新我同时使用了两个答案:

创建类似这样的内容:

count_row = df.shape[0]

df["score"] = (count_row+1 - df.drop(columns='Team')).sum(axis=1)
df['extra_points'] = (df ==1).sum(axis=1)
df['total'] = df.loc[:,['score','extra_points']].sum(axis=1)
df_total = df.groupby("Team").agg({"total": "sum"}).reset_index().sort_values(by='total', ascending=False)

print(df)

print(df_total)

2 个答案:

答案 0 :(得分:1)

更新计算每列的最佳团队:

df.set_index('Team').idxmax()
match1    BadHomburg
game12    BadHomburg
match3    BadHomburg
dtype: object

如果Team列中有重复团队,并且您想要 sum ,我将DataFrame.meltgroupby.sum一起使用:

df_ranking = ( df.melt('Team')
                 .groupby('Team')['value']
                 .sum()
                 .sort_values(ascending = False)
                 .to_frame('Points')
                 .reset_index() )

df_ranking.index = df_ranking.index + 1

print(df_ranking)
                   Team  Points
1            BadHomburg    42.0
2             Nümbrecht    16.0
3        Nienburg/Weser    16.0
4  Nieder-Olm/Wörrstadt    14.0
5               Dorheim    14.0
6            Völklingen    10.0
7              Pohlheim     8.0
8            Sandhausen     6.0

检查最佳团队

df_ranking.loc[1,'Team']
#'BadHomburg'

答案 1 :(得分:1)

您也可以这样:

df = pd.DataFrame([
        ['Sandhausen',2,3,1],
        ['Pohlheim',1,1,6],
        ['Völklingen',4,2,4],
        ['Nieder-Olm/Wörrstadt',5,7,2],
        ['Nümbrecht',7,6,3],
        ['Dorheim',3,4,7],
        ['Nienburg/Weser',6,5,5],
        ['Bad Homburg',8,8,8],
        ['Bad Homburg',9,9,9]
    ],
    columns=["Team", "match1", "game12", "match2"])

df["score"] = ( 10 - df.drop(columns=["Team"]) ).sum(axis=1)

基本上在这里,我选择应考虑得分的所有列(在这种情况下,除列Team以外的所有列)[df.drop(columns=["Team"])]。

然后,我将等级转换为得分(等级1-> 10-1 = 9,等级2-> 10-2 = 8,...,等级9-> 10-9 = 1)[ ( 10 - ... )

此后,我对行(axis = 1)上的所有值求和,并将其分配给列score [df["score"] = (...).sum(axis=1)]。

结果如下:

                   Team  match1  game12  match2  score
0            Sandhausen       2       3       1     24
1              Pohlheim       1       1       6     22
2            Völklingen       4       2       4     20
3  Nieder-Olm/Wörrstadt       5       7       2     16
4             Nümbrecht       7       6       3     14
5               Dorheim       3       4       7     16
6        Nienburg/Weser       6       5       5     14
7           Bad Homburg       8       8       8      6
8           Bad Homburg       9       9       9      3

此外,如果您希望选择要使用的列而不是删除列,则可以使用以下内容:

df[[ col for col in df.columns if col != "Team" ]]

col != "Team"中正在进行过滤,但是您可以更改它。