如何显示pandas数据框中元素的数量顺序



我正在尝试处理以下数据帧

import pandas as pd
import io
csv_data = '''
ID,age,Year
100,75,2020
100,76,2021
200,64,2020
200,65,2021
200,66,2022
300,69,2020
300,70,2021
300,71,2022
300,72,2023
'''
df = pd.read_csv(io.StringIO(csv_data))
df = df.set_index(['ID', 'age'])
df
Year
ID  age 
100 75  2020
76  2021
200 64  2020
65  2021
66  2022
300 69  2020
70  2021
71  2022
72  2023

ID表示同一个人,年份表示访问的年份。

将基于ID进行多索引岁和. 此时,是否可以从显示ID年龄元素?

理想的显示如下所示。

Year
ID  age 
300 69  2020
70  2021
71  2022
72  2023
200 64  2020
65  2021
66  2022
100 75  2020
76  2021

除非要求您在.read_csv之后立即set_index,否则以下内容应该是合理的…

获取ID出现的次数计数-我们可以使用.value_counts来实现这一点,它可以方便地按降序自动排序…

id_freq = df['ID'].value_counts()

然后使用id_freq的索引索引DF和.reindex,例如:

df = df.set_index(['ID', 'age']).reindex(id_freq.index, level=0)

这将给你:

Year
ID  age      
300 69   2020
70   2021
71   2022
72   2023
200 64   2020
65   2021
66   2022
100 75   2020
76   2021

也可能有有用的副作用,因为您还可以运行id_freq.value_counts()来获得每个患者通常出现的次数分布。


如果您必须从头开始索引,那么您不妨将其提供给.read_csv,例如:

df = pd.read_csv(io.StringIO(csv_data), index_col=['ID', 'age'])

然后与上面类似,在索引的第一级的值上重新索引,例如:

df = df.reindex(df.index.get_level_values(0).value_counts().index, level=0)

您可以首先使用groupbysize计算每个ID组的长度,然后根据长度对ID值进行排序:

s = df.groupby('ID').size()
df.sort_values('ID', key=lambda i:s[i], ascending=False)

输出:

Year
ID  age
300 69   2020
70   2021
71   2022
72   2023
200 64   2020
65   2021
66   2022
100 75   2020
76   2021

您可以根据两列进行排序,并设置哪些列升序,哪些列不升序,如下所示:

>>> print(df.sort_values(['ID', 'age'], ascending=[False, True]))
Year
ID  age      
300 69   2020
70   2021
71   2022
72   2023
200 64   2020
65   2021
66   2022
100 75   2020
76   2021

您可以这样排序这些值:

df = df.sort_values(['ID', 'age'],
ascending = [False, True])

pandassort_index()用于根据索引值对数据框进行排序。

df.sort_index(ascending=[False, True])

最新更新