2017-10-11 81 views
0

我期待做一个简单的任务,整齐地打印name行,对应的国家,以及那个行的排序降序排列的权利islmtotal。我下面的代码只打印islmtotal,但我已经给了它应该如何看一个例子:如何打印第二排序相应行的大熊猫行

Name Islmtotal 


USA 1.99 

GER 1.93 

NED .76 

religion = pd.read_csv('natldata.csv', usecols = [0, 2, 51, 52, 53, 54, 55, 56, 57, 58], na_values=['NULL']) 

religion['islmtotal']= religion[['islmsunpct', 'islmshipct', 'islmibdpct', 'islmnatpct', 'islmalwpct', 'islmahmpct', 'islmothrpct', 'islmgenpct']].sum(axis=1) 

religyearask = input("Please enter year in multiples of 5 (eg 1980): ") 

maxstateyear = religion.loc[religion['year'] == religyearask].sort_values('year', ascending=False).groupby(['name'], sort=False)['islmtotal'].max() 

print(maxstateyear.to_string(index=False)) 
+0

它是怎样现在打印?你最初的df是什么样的?没有太多的信息在这里继续。 –

+0

为了清晰起见,我编辑了上面的代码。 –

回答

0

它有助于打破了步骤,这样你就可以找出你的麻烦之源。

首先,创建一个掩码来索引。

m = religion['year'] == religyearask 

现在,索引和排序。

df = religion.loc[m].sort_values('year', ascending=False) 

现在,groupby并找到max

df = df.groupby('name', as_index=False)['islmtotal'].max() 

大概,这是你麻烦的根源。请注意,默认情况下,groupby会将分组依据转换为索引,因此as_index=False会阻止此操作。

现在,转换为to_string并打印。

print(maxstateyear.to_string(index=False)) 

OneLiner™

print(
    religion.loc[religion['year'] == religyearask]\ 
      .sort_values('year', ascending=False)\ 
      .groupby('name', as_index=False)['islmtotal'].max()\ 
      .to_string(index=False) 
) 
+0

好吧,这让我更加接近,但是我看到上面的代码显示的是列,但是它的按字母顺序排列的国家/地区组。我更喜欢降序数字作为排序方法。 –

+0

@Jibz先生很了解。不幸的是,如果你只是向我解释,我无法想象你的问题。这只是你的代码,只是稍作修改而已。如果您希望获得关于如何改变您的方法以接近您的解决方案的帮助,我建议您打开一个新问题并执行以下操作; 1.以文本形式显示数据,2.显示当前输出。 3.显示您的预期输出。 4.显示你的当前代码。干杯! –