用下面数据作为测试, 数据是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