上文说到了怎么对DataFrame中的值进行转换,那么如果想对索引进行转换,应该怎么做呢?
重命名轴索引
第一种方法:暴力地重定义
直接对index,columns属性进行重赋值即可:
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(12).reshape((3, 4)),
index=['a', 'b', 'c'],
columns=['1', '2', '3', '4'])
print(a)
# 1 2 3 4
# a 0 1 2 3
# b 4 5 6 7
# c 8 9 10 11
a.index = [1, 2, 3]
a.columns = ['a', 'b', 'c', 'd']
print(a)
# a b c d
# 1 0 1 2 3
# 2 4 5 6 7
# 3 8 9 10 11
第二种方法:使用rename方法
rename方法可以实现对轴索引进行批量修改。
rename既可以传入一个方法,也可以传入一个字典(旧索引与新索引之间的映射)。
import numpy as np
import pandas as pd
a = pd.DataFrame(np.arange(12).reshape((3, 4)),
index=['a', 'b', 'c'],
columns=['1', '2', '3', '4'])
print(a)
# 1 2 3 4
# a 0 1 2 3
# b 4 5 6 7
# c 8 9 10 11
transfrom = lambda x: x[:].upper()
print(a.rename(index=transfrom, columns={'1': 'one', '2': 'two'}))
# one two 3 4
# A 0 1 2 3
# B 4 5 6 7
# C 8 9 10 11
如果想修改原有的数据集,传入关键字Inplace=True.
.
分箱:
在现实的数据分析中,我们往往有这样的需求:
现在我们有100个人的身高,我们想知道:
- 身高在175以上的有多少人?在160以下的有多少人?
- 前25%的数据分布在哪个区间?
分箱可以帮助我们做到这些。
1、cut
假设有数据集:
ages = [30, 22, 25, 27, 37, 17, 33, 25, 41, 50]
我们可以自行定义多个区间,从而判断数据集中数据的所属。
import pandas as pd
ages = [30, 22, 25, 27, 37, 17, 33, 25, 41, 50]
# bins表示的区间为:(17, 25]、(25, 33]、 (33, 60]
bins = [17, 25, 33, 60]
cats = pd.cut(ages, bins)
print(cats)
# [(25.0, 33.0], (17.0, 25.0], (17.0, 25.0], (25.0, 33.0], (33.0, 60.0], NaN,
# (25.0, 33.0], (17.0, 25.0], (33.0, 60.0], (33.0, 60.0]]
# Categories (3, interval[int64]): [(17, 25] < (25, 33] < (33, 60]]
另外,cats对象还有如下几个属性及操作
- codes:各个元素所属区间的序号
- categories:区间数组
- pd.value_counts(cats):各个区间中元素的个数
import pandas as pd
ages = [30, 22, 25, 27, 37, 17, 33, 25, 41, 50]
bins = [17, 25, 33, 60]
cats = pd.cut(ages, bins)
print(cats.codes)
# [ 1 0 0 1 2 -1 1 0 2 2] -1表示该元素不属于任何一个区间
print(cats.categories)
# IntervalIndex([(17, 25], (25, 33], (33, 60]],
# closed='right',
# dtype='interval[int64]')
print(pd.value_counts(cats))
# (33, 60] 3
# (25, 33] 3
# (17, 25] 3
# dtype: int64
另外,如果在cut函数中不传入区间,而是传入一个整数k。它会把数据集分成k个相同长度的区间(长度为(max-min)/k)
import numpy as np
import pandas as pd
data = np.random.rand(20)
cats = pd.cut(data, 4)
print(pd.value_counts(cats))
# (0.292, 0.461] 6
# (0.798, 0.967] 5
# (0.461, 0.63] 5
# (0.63, 0.798] 4
# dtype: int64
现在你可能会问:如果想把数据分为整数k个区间,并且区间内元素数量相等,应该怎么做呢?
这时可以采用qcut。
2、qcut
qcut利用分位数来对数据进行分箱。
可以在qcut方法中传入整数k,它会把数据集分成k个元素数量相同的区间。
import numpy as np
import pandas as pd
data = np.random.rand(20)
cats = pd.qcut(data, 4)
print(pd.value_counts(cats))
# (0.64, 0.877] 5
# (0.51, 0.64] 5
# (0.239, 0.51] 5
# (0.0167, 0.239] 5
# dtype: int64
也可以传入一个分位数数组(0到1之间的数据)。
比如说传入[0, 0.1, 0.3, 0.7, 1.],它会将数据划分为4个区间,分别为:前10%, 前10%到前30%、前30%到70%、后30%
import numpy as np
import pandas as pd
data = np.random.rand(20)
cats = pd.qcut(data, [0, 0.1, 0.3, 0.7, 1.])
print(pd.value_counts(cats))
# (0.26, 0.62] 8
# (0.62, 0.936] 6
# (0.123, 0.26] 4
# (0.00046999999999999993, 0.123] 2
# dtype: int64
.
参考资料
《利用python进行数据分析》
转载:https://blog.csdn.net/weixin_43901558/article/details/104959782
查看评论