我正在尝试处理以下数据帧
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)
您可以首先使用groupby
和size
计算每个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])