【问题标题】:PANDAS dataframe python: wanting to sort values by groupPANDAS数据框python:想要按组对值进行排序
【发布时间】:2020-05-11 15:12:09
【问题描述】:

Link to census data

我在上面有一个 CSV 文件的以下链接,其中包含我希望处理的原始数据。

census_df = df = pd.read_csv('https://raw.githubusercontent.com/Qian-Han/coursera-Applied-Data-Science-with-Python/master/Introduction-to-Data-Science-in-Python/original_data/census.csv')
sortedit = census_df.sort_values(by = ['STNAME','CENSUS2010POP'],ascending=False)

我正在尝试按列 'CENSUS2010POP' 的降序排列数据。

我还想按“状态”的字母顺序对数据进行排序,因此我在上面的公式中包含 'STNAME' 列。

但是,我只想从每个州 ('STNAME') 中为 'CENSUS2010POP' 选择 3 个最高值

因此,如果总共有 146 个州,我应该 (146 x 3) 行在我的新数据框中(因此在“CENSUS2010POP”列中)。

如果有人能帮我一把,我将不胜感激?

【问题讨论】:

    标签: python pandas csv dataframe series


    【解决方案1】:

    IIUC,groupby.nalrgest 创建索引过滤器,与 sort_values 链接

    df2 = df.iloc[df.groupby('STNAME')['CENSUS2010POP']\
                                  .nlargest(3).index.get_level_values(1)]\
                                  .sort_values(['STNAME','CENSUS2010POP'],ascending=True)
    
    print(df['STNAME'].nunique())
    
    51
    
    
    print(df2.shape)
    (152, 100)
    

    print(df2[['STNAME','CENSUS2010POP']])
    
       STNAME  CENSUS2010POP
    49      Alabama         412992
    37      Alabama         658466
    0       Alabama        4779736
    76       Alaska          97581
    71       Alaska         291826
    ...         ...            ...
    3137  Wisconsin         947735
    3096  Wisconsin        5686986
    3182    Wyoming          75450
    3180    Wyoming          91738
    3169    Wyoming         563626
    
    [152 rows x 2 columns]
    

    【讨论】:

    • 我还没有检查答案,但我的整体代码现在看起来像这样: def answer_six(): df = census_df.groupby(["STNAME"]).apply(lambda x: x. sort_values(["CENSUS2010POP"], 升序 = False)).reset_index(drop=True) df.groupby('STNAME').head(3)[['STNAME','CENSUS2010POP']] df.sort_values([" CENSUS2010POP"],ascending=False) df = df[0:3] return df['STNAME'] 如此有效,它将返回 'CENSUS2010POP' 值最大的 3 个州的名称。它给了我:加利福尼亚、德克萨斯、纽约 :)
    • 我会避免申请,因为它只能在不能使用任何 api 方法来重新塑造数据时作为最后的手段。有本地方法来处理您的问题,这将工作速度更快,更具可扩展性。 @Caledonian26
    【解决方案2】:

    试试这个:

    df = census_df.groupby(["STNAME"]).apply(lambda x: x.sort_values(["CENSUS2010POP"], ascending = False)).reset_index(drop=True)
    
    df.groupby('STNAME').head(3)[['STNAME','CENSUS2010POP']]
    

    第一条语句返回每个STNAME中按CENSUS2010POP排序的数据帧。

    第二条语句返回前 3 个。

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 2013-06-05
      • 2021-03-27
      • 1970-01-01
      • 2022-12-09
      • 2017-08-31
      • 2017-12-26
      • 2021-11-04
      • 2020-04-20
      相关资源
      最近更新 更多