pandas 索引设置

用下面数据作为测试, 数据是5月份6部电影的票房

 2010-05-09,唐山大地震,51315.0
 2010-05-09,婚前试爱,5659.0
 2010-05-16,老男孩,1599.0
 2010-05-23,剑雨,2224.0
 2010-05-23,剑雨,
 2010-05-23,老男孩,1605.0
 2010-05-09,唐山大地震,51876.0
 2010-05-16,X战警-天启,102063.0
 2010-05-16,X战警-天启,102364.0
 2010-05-16,X战警-天启,102163.0
 2010-05-09,婚前试爱,5659.0
 2010-05-16,老男孩,
 2010-05-23,剑雨,2246.0
 2010-05-16,让子弹飞,
 2010-05-16,让子弹飞,
 2010-05-09,婚前试爱,5681.0
 2010-05-16,X战警-天启,102063.0
 2010-05-09,婚前试爱,5653.0
 2010-05-16,X战警-天启,
 2010-05-16,老男孩,1595.0
 2010-05-16,让子弹飞,106652.0
 2010-05-09,唐山大地震,51621.0
 2010-05-09,唐山大地震,51927.0
 2010-05-09,婚前试爱,5620.0
 2010-05-16,X战警-天启,101159.0
 2010-05-16,让子弹飞,
 2010-05-09,唐山大地震,51876.0
 2010-05-09,婚前试爱,5636.0
 2010-05-16,让子弹飞,
 2010-05-09,唐山大地震,51876.0
 2010-05-16,让子弹飞,106652.0
 2010-05-09,唐山大地震,51570.0
 2010-05-16,让子弹飞,106024.0
 2010-05-16,老男孩,
 2010-05-16,X战警-天启,100758.0
 2010-05-23,让子弹飞,106024.0
 2010-05-09,婚前试爱,5586.0
 2010-05-23,剑雨,
 2010-05-09,婚前试爱,5620.0
 2010-05-09,唐山大地震,51162.0
 2010-05-23,老男孩,1595.0
 2010-05-09,唐山大地震,51621.0
 2010-05-23,剑雨,2253.0
 2010-05-23,X战警-天启,101260.0
 2010-05-16,让子弹飞,105397.0
 2010-05-16,X战警-天启,101761.0
 2010-05-16,老男孩,1596.0
 2010-05-09,唐山大地震,
 2010-05-23,剑雨,2250.0
 2010-05-16,X战警-天启,101260.0
 2010-05-09,婚前试爱,
 2010-05-23,剑雨,2246.0
 2010-05-16,X战警-天启,101761.0
 2010-05-09,婚前试爱,
 2010-05-16,让子弹飞,105397.0
 2010-05-16,老男孩,
 2010-05-16,让子弹飞,106547.0
 2010-05-09,唐山大地震,51672.0
 2010-05-16,老男孩,1592.0
 2010-05-16,X战警-天启,102063.0
 2010-05-16,老男孩,1611.0
 2010-05-23,剑雨,2213.0
 2010-05-16,老男孩,1604.0
 2010-05-16,老男孩,1599.0
 2010-05-09,唐山大地震,
 2010-05-23,剑雨,
 2010-05-16,让子弹飞,
 2010-05-09,唐山大地震,51417.0
 2010-05-23,剑雨,
 2010-05-16,老男孩,1607.0
 2010-05-09,婚前试爱,5681.0
 2010-05-23,剑雨,2237.0
 2010-05-09,唐山大地震,51927.0
 2010-05-16,让子弹飞,105188.0
 2010-05-16,X战警-天启,102263.0
 2010-05-16,老男孩,
 2010-05-09,婚前试爱,5625.0
 2010-05-16,让子弹飞,106652.0
 2010-05-16,X战警-天启,
 2010-05-09,婚前试爱,5636.0
 2010-05-16,X战警-天启,
 2010-05-16,让子弹飞,104979.0
 2010-05-09,婚前试爱,
 2010-05-16,老男孩,
 2010-05-09,唐山大地震,51519.0
 2010-05-16,老男孩,1588.0
 2010-05-16,让子弹飞,106233.0
 2010-05-16,老男孩,1590.0
 2010-05-16,X战警-天启,100959.0
 2010-05-09,婚前试爱,5664.0
 2010-05-09,唐山大地震,
 2010-05-16,老男孩,1606.0
 2010-05-23,老男孩,1595.0
 2010-05-23,X战警-天启,100959.0

读入并去重去有空的行

f1 = 'fbr_d_n_b.csv'
df20105 = pd.read_csv(f1, names=['date','film','price'])
df20105.drop_duplicates(inplace=True)
df20105.dropna(inplace=True)
print df20105.__len__()

单层索引

默认的索引就是单层索引, 下面对单层索引进行操作

1 . 查找/选取

获取所有索引
df20105.index.values

2 . 替换/设置新索引
记住3个函数
reset_index, 使索引按0,1,2,3,4开始递增
set_index ,将dataframe其中某列作为索引
reindex 设置新索引, 不存在的index对应的数据为Nan

由于上面的去重去空操作, 导致索引不是递增的, 设置为递增的:
df20105.reset_index(drop=True,inplace=True)  #重新恢复索引

想让date这列作为索引, 把原来索引去掉:
df20105.set_index('date')

上面用set_index将数据中已经有的列作为了index, 
还可以用reindex将一个序列值作为index, 可以发现下面最后的5行数据都是Nan,
是因为数据是从原来索引对应的数据按部就班过来的, 所以是nan
df20105.reindex(map(lambda x: x, range(5, df20105.__len__()+5)))

3 . 排序

按降序排列
df20105.sort_index(ascending=False)

其他

设置索引的名字
df20105.index.name = 'index_name'

多层索引

先来看个问题: 读入数据,将dataframe 改造成 5-9日, 5-16日, 5-23的6部电影各自的平均票房,若某部电影在当日没有票房则用0表示(注意:2010-05-09 唐山大地震也可能多个不同的数据, 取平均值即可)

我们只要将dataframe处理成如下格式即可:

2010-05-09  X战警-天启         0.000000
            剑雨             0.000000
            唐山大地震      51564.333333
            婚前试爱        5640.500000
            老男孩            0.000000
            让子弹飞           0.000000
2010-05-16  X战警-天启    101638.888889
            剑雨             0.000000
            唐山大地震          0.000000
            婚前试爱           0.000000
            老男孩         1598.800000
            让子弹飞      105860.000000
2010-05-23  X战警-天启    101109.500000
            剑雨          2237.166667
            唐山大地震          0.000000
            婚前试爱           0.000000
            老男孩         1600.000000
            让子弹飞      106024.000000

用上面给的数据, 去重去空后打印前5行如下

          date   film    price
0   2010-05-09  唐山大地震  51315.0
1   2010-05-09   婚前试爱   5659.0
2   2010-05-16    老男孩   1599.0
3   2010-05-23     剑雨   2224.0
4   2010-05-23    老男孩   1605.0

在按date和名称分组

df20105 = df20105.groupby(['date','film'])['price'].mean()

date         film  
 2010-05-09  唐山大地震      51564.333333
             婚前试爱        5640.500000
 2010-05-16  X战警-天启    101638.888889
             老男孩         1598.800000
             让子弹飞      105860.000000
 2010-05-23  X战警-天启    101109.500000
             剑雨          2237.166667
             老男孩         1600.000000
             让子弹飞      106024.000000

按两列进行分组, 此时的dataframe变成了两个索引, 打印type看看

print type(df20105.index)

<class 'pandas.indexes.multi.MultiIndex'>

得到的是MultiIndex, 他就是多层索引, 按照题目意思, 只要将4号缺的 4部电影,16号缺的3部和23号缺的2部添加上去,然后在设置票房为0即可。 可以创建一个新的MultiIndex多层索引, 然后取代现有的索引, 然后将空值部分用0填充。

先获取MultiIndex创建需要的参数, 3个日期和6部电影

index_data = df20105.index.levels #得到多层列的数据

index_data如下:

[[u' 2010-05-09', u' 2010-05-16', u' 2010-05-23'], [u'X战警-天启', u'剑雨', u'唐山大地震', u'婚前试爱', u'老男孩', u'让子弹飞']]

构造数据:

dates = index_data[0].values
films = index_data[1].values
arrays = [[], []]
for d in dates:
    for f in films:
        arrays[0].append(d)
        arrays[1].append(f)

创建MultiIndex:

index = pd.MultiIndex.from_arrays(arrays)  #arrays里的列表长度必须相同

用新的index替换, 并填充空值为0

df20105 = df20105.reindex(index,fill_value=0)

最后打印结果一致

 2010-05-09  X战警-天启         0.000000
             剑雨             0.000000
             唐山大地震      51564.333333
             婚前试爱        5640.500000
             老男孩            0.000000
             让子弹飞           0.000000
 2010-05-16  X战警-天启    101638.888889
             剑雨             0.000000
             唐山大地震          0.000000
             婚前试爱           0.000000
             老男孩         1598.800000
             让子弹飞      105860.000000
 2010-05-23  X战警-天启    101109.500000
             剑雨          2237.166667
             唐山大地震          0.000000
             婚前试爱           0.000000
             老男孩         1600.000000
             让子弹飞      106024.000000

你可能感兴趣的:(pandas 索引设置)