【问题标题】:pandas sort values in pivot tablepandas 对数据透视表中的值进行排序
【发布时间】:2021-05-25 19:12:27
【问题描述】:

我有一个数据框,我想将所有行分组在 id 中,其中在 country = russia 和 month = March 的行之后是 country != russia 的行

输入数据框:

import pandas as pd
import numpy as np
data = {'fruit': ['pear','pear','pear','banana', 'banana', 'banana', 'apricot', 'pear','watermelon','pear','banana', 'banana', 'banana','banana', 'melon', 'cherry','banana', 'kiwi', 'kiwi', 'kiwi'],
'country': ['france','france', 'france', 'russia', 'russia', 'russia','russia', 'france','russia','usa', 'russia', 'ghana','ghana','ghana', 'ghana', 'albania','andorra', 'russia', 'russia', 'russia'],
'id': ['01','01','01','01','01','01','02','02','03','03','011', '011', '011','011', '6', '6','6', '5', '5', '5'],
'id1': ['01','01','01','01','01','01','02','02','03','03','011', '011', '011','011', '6', '6','6', '5', '5', '5'],
'month': ['january','september','january','january','september','january','january', 'september','march','march', 'november', 'march', 'january','january', 'march', 'january','july', 'march', 'march', 'april']        
}
df = pd.DataFrame(data, columns = ['fruit','country', 'id','id1', 'month'])

我用pd.pivot_table(df, values='id', index=['fruit','country'], columns='id1', aggfunc='count') 制作了数据透视表,我得到了许多无用的行,其中有NaN 或非常小的数字。

如何对数据透视表进行排序以获取数字不少于 3 的行?谁能看到问题

我需要得到这个数据框

data = {'fruit': ['banana', 'banana', 'kiwi','pear'],
'country': [ 'ghana','russia','russia','france'],
'01': [np.nan,3,np.nan,3],
'011': [3,1,np.nan,np.nan],
'5': [np.nan,np.nan,3,np.nan]
}
df = pd.DataFrame(data, columns = ['fruit','country', '01', '011','5'])

【问题讨论】:

  • 你输入的数据和图片不一样
  • @Corralien 谢谢你,我刚刚更正了它

标签: python pandas pivot pivot-table


【解决方案1】:

如果df2 是您的数据透视表,您可以这样做:

row_mask = np.any((df2 >= 3).values, axis=1)
col_mask = np.any((df2 >= 3).values, axis=0)
df2.loc[row_mask, col_mask]
            id1  01     011       5
fruit   country             
banana  ghana   NaN     3.0     NaN
        russia  3.0     1.0     NaN
kiwi    russia  NaN     NaN     3.0
pear    france  3.0     NaN     NaN 

【讨论】:

  • 非常感谢 :)
【解决方案2】:

这是你想要的结果吗?它是“获取数字不少于 3 的行”,但与您的结果图片不同..

df = df.pivot_table(index=['fruit','country'], columns='id1', values='id', aggfunc='count')
df['total'] = df.sum(axis=1)
df.drop(df.loc[df['total']<3].index, inplace=True)
df.dropna(how='all', axis=1, inplace=True)

输出

         id1    01  011 02  5   total
fruit   country                 
banana  ghana   NaN 3.0 NaN NaN 3.0
banana  russia  3.0 1.0 NaN NaN 4.0
kiwi    russia  NaN NaN NaN 3.0 3.0
pear    france  3.0 NaN 1.0 NaN 4.0

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2017-03-27
    • 1970-01-01
    • 2016-06-09
    • 2023-04-06
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多