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
### 回答1: 在 Pandas 中,可以使用 `set_index()` 方法将一个或多个列设置索引。例如,假设有以下的 DataFrame: ``` name age gender 0 Bob 25 M 1 Jane 30 F 2 Tom 35 M ``` 可以将 `name` 列设置索引: ```python df.set_index('name', inplace=True) ``` 这样就可以通过名字来访问每行的数据了: ```python print(df.loc['Bob']) ``` 输出: ``` age 25 gender M Name: Bob, dtype: object ``` 如果需要设置多个列作为索引,可以将列名以列表的形式传递给 `set_index()` 方法: ```python df.set_index(['name', 'gender'], inplace=True) ``` 这样就可以使用多个列构成的索引来访问每行的数据了。 ### 回答2: 在pandas中,设置索引是指将某一列或多列作为数据框的索引,使其在数据处理和分析过程中起到更重要的作用。设置索引可以提高数据访问和操作的效率,并且可以根据索引进行数据筛选和聚合等操作。 pandas提供了多种方法来设置索引,其中最常用的有两种方式: 第一种方式是使用set_index()函数,该函数将指定的列设置索引,例如dataframe.set_index('column_name')可以将名为'column_name'的列设置索引。 第二种方式是在数据读取的时候就指定索引列,例如在读取csv文件时可以使用index_col参数指定某一列作为索引列,例如pd.read_csv('file.csv', index_col='column_name')。 通过设置索引,我们可以根据索引进行数据操作,例如使用loc()函数进行按索引值选取数据,使用sort_index()函数按索引排序数据等。 在设置索引时需要注意以下几点: 首先,索引应该是唯一的,不能有重复的值,如果有重复的值可以考虑使用多级索引(层次化索引)来进行设置。 其次,设置索引之后会导致原来的索引列变为索引,数据框中原有的索引会被覆盖掉。 最后,设置索引之后可以使用reset_index()函数将索引还原为列,重新生成默认的数字索引。 总之,pandas中的索引设置是一种重要的数据操作方式,能够提高数据处理的效率和灵活性,并且可以根据索引进行数据筛选和聚合等操作,是数据分析过程中常用的一项技巧。 ### 回答3: Pandas是一个功能强大的数据分析工具,可以用来处理和操作数据。设置索引是一种常见的操作,可以帮助我们更方便地访问和操作数据。 在Pandas中,可以使用set_index()方法来设置索引。set_index()方法可以接受一个参数,该参数可以是一个列名或由列名组成的列表,也可以是一个Series或DataFrame。设置索引后,原始的索引将被替换为新的索引设置索引后,我们可以通过索引来访问和操作数据。例如,可以使用loc[]方法根据索引的值来选择特定的行或列。此外,还可以使用reset_index()方法来重置索引,使其恢复为默认的整数索引。 除了通过set_index()方法设置索引,还可以在读取数据时设置索引。可以在读取数据时指定index_col参数来指定将某一列作为索引,或者通过传递一个列名列表给index_col参数来设置多个索引设置索引可以提高数据的查询和操作效率,特别是当我们需要频繁地根据某一列或多列进行筛选和计算时。通过设置合适的索引,可以使得数据操作更加方便和高效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值