飞道的博客

pandas:重命名index、columns,分箱

705人阅读  评论(0)

上文说到了怎么对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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场