Pandas之MultiIndex对象的示例详解
什么是MultiIndex对象
在Pandas中我们可能会遇到需要对数据进行层次化处理的情况,这时可采用MultiIndex对象来处理数据。
MultiIndex对象是通过指定多个层次化的索引来实现对数据的分组和筛选的。
如何创建MultiIndex对象
在Pandas中创建MultiIndex对象通常有两种方式:
1. 隐式创建
在读取数据时,可以指定需要层次化的列名,Pandas会自动将这些列名转换为MultiIndex对象。如下:
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.index)
输出结果如下:
MultiIndex(levels=[['Jerry', 'Tom', 'Tony'], ['2020-01', '2020-02', '2020-03']],
codes=[[1, 1, 0, 0, 2, 2], [0, 1, 0, 1, 2, 0]],
names=['name', 'month'])
2. 显式创建
可以直接调用Pandas的MultiIndex方法来创建一个MultiIndex对象。如下:
import pandas as pd
indexes = pd.MultiIndex.from_arrays([['Jerry', 'Jerry', 'Tom', 'Tom', 'Tony', 'Tony'],
['2020-01', '2020-02', '2020-01', '2020-02', '2020-03', '2020-01']],
names=['name', 'month'])
print(indexes)
输出结果如下:
MultiIndex(levels=[['Jerry', 'Tom', 'Tony'], ['2020-01', '2020-02', '2020-03']],
codes=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 2, 0]],
names=['name', 'month'])
如何使用MultiIndex对象
1. 索引与筛选
使用MultiIndex对象时,可以采用以下方式进行索引和筛选:
- .loc方法:使用元组进行索引。
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.loc[('Jerry', '2020-01')])
输出结果如下:
score 98
Name: (Jerry, 2020-01), dtype: int64
- .iloc方法:使用元组进行索引。
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.iloc[0])
输出结果如下:
score 98
Name: (Jerry, 2020-01), dtype: int64
- .xs方法:使用参数指定需要筛选的索引。
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.xs('Jerry', level=0))
输出结果如下:
score
month
2020-01 98
2020-02 95
2. GroupBy操作
使用MultiIndex对象的GroupBy操作时,可以采用以下方式:
- .groupby方法 + .agg方法:合并分组后的结果。
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.groupby(level=0).agg({'score': 'mean'}))
输出结果如下:
score
name
Jerry 96.500000
Tom 80.000000
Tony 66.666667
- .unstack方法:将某一层次的索引移动到列中。
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
print(df.unstack(level=0))
输出结果如下:
score
name Jerry Tom Tony
month
2020-01 98 78 54
2020-02 95 82 78
2020-03 NaN 89 87
示例1:使用MultiIndex对象分别统计男女各科目的平均成绩
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'gender'])
indexes = df.index
indexes.set_names(names=['name', 'gender'], inplace=True)
df_group = df.groupby([indexes.get_level_values('gender'), indexes.get_level_values('subject')])['score'].mean()
df_group = df_group.unstack(level=0)
print(df_group)
输出结果如下:
gender F M
subject
Chinese 65.333333 77.333333
English 71.000000 78.333333
Math 68.000000 73.333333
示例2:使用MultiIndex对象对数据进行拆分合并
import pandas as pd
df = pd.read_csv('example.csv', index_col=['name', 'month'])
indexes = df.index
indexes.set_names(names=['name', 'month'], inplace=True)
df_Jerry = df.loc[('Jerry', slice(None)), :]
df_Tom = df.loc[('Tom', slice(None)), :]
df_Tony = df.loc[('Tony', slice(None)), :]
df_merge = pd.concat([df_Jerry, df_Tom])
df_merge = pd.concat([df_merge, df_Tony])
df_merge.to_csv('example_merge.csv')
输出结果为example_merge.csv文件,内容为:
name,month,score
Jerry,2020-01,98
Jerry,2020-02,95
Tom,2020-01,78
Tom,2020-02,82
Tony,2020-01,54
Tony,2020-02,78
Tony,2020-03,87
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pandas之MultiIndex对象的示例详解 - Python技术站