pandas 切分数据 行拆分成多行

pandas的cut函数可以用于按照绝对数进行分组,返回的是一个特殊的Categorical对象,你可以将其看做一组表 示面元名称的字符串。 实际上,它含有一个表示 不同分类名称的levels数组以及一个为年龄数据进行标号的labels属性。
跟“区间”的数学符号 一样,圆括号表示开端,而方括号则表示闭端(包括)。 哪边是闭端可以通过right.
也可以自定义label名称。

from pandas import Series,DataFrame
import pandas as pd
import numpy as np
from numpy import nan as NA 
from matplotlib import pyplot as plt
ages = [20,22,25,27,21,23,37,31,61,45,41,32]
#将所有的ages进行分组
bins = [18,25,35,60,100]
#使用pandas中的cut对年龄数据进行分组
cats = pd.cut(ages,bins)
cats
#打印结果:
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]

#调用pd.value_counts方法统计每个区间的人数
pd.value_counts(cats)
#打印结果:
(18, 25]     5
(35, 60]     3
(25, 35]     3
(60, 100]    1
dtype: int64

#显示第几个区间index值
cats.codes
#打印结果:
array([0, 0, 0, 1, 0, 0, 2, 1, 3, 2, 2, 1], dtype=int8)

#为分类出来的每一组年龄加上标签
group_names = ["Youth","YouthAdult","MiddleAged","Senior"]
personType = pd.cut(ages,bins,labels=group_names)
personType
#打印结果:
[Youth, Youth, Youth, YouthAdult, Youth, ..., YouthAdult, Senior, MiddleAged, MiddleAged, YouthAdult]
Length: 12
Categories (4, object): [Youth < YouthAdult < MiddleAged < Senior]

#用一个直方图简单的展示
plt.hist(personType)

# cut 及 qcut用法
data = np.random.randn(100)   #服从正态分布
result = pd.qcut(data,4) #qcut会将100个数据进行排序,然后再将data数据均分成四组

#qcut : 跟cut一样也可以自定义分位数(0到1之间的数值,包括端点)
result = pd.qcut(data,[0,0.1,0.5,0.9,1])


用cut函数将一组数据分割成n份
#cut函数分割的方式:数据里的(最大值-最小值)/n=每个区间的间距
#利用数据中最大值和最小值的差除以分组数作为每一组数据的区间范围的差值
result = pd.cut(data,4,precision=2)  #precision保留小数点的有效位数

pandas的qcut函数可以用于按照分位数进行分组,返回的同样是一个特殊的Categorical对象。————————————————

一行拆多行


方法一:基于一列拆多列的结果,多次选取列再拼接。该方法容易理解,前提是需要先实现一列拆多列、代码冗余不优雅

# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np

df
    Type        Brands_rank
0   Computer    Mac-Dell-Lenovo
1   Phone       Mac-XiaoMi-HuaWei
2   Pad         Mac-HuaWei

df_index_1 = df_column[['Type', 'Brands-First']].rename(columns={'Brands-First':'Brands'})
df_index_2 = df_column[['Type', 'Brands-Second']].rename(columns={'Brands-Second':'Brands'})
df_index_3 = df_column[['Type', 'Brands-Third']].rename(columns={'Brands-Third':'Brands'})
df_index = pd.concat([df_index_1, df_index_2, df_index_3]).dropna().sort_index() 

print(df_index)
    Type        Brands
0   Computer    Mac
0   Computer    Dell
0   Computer    Lenovo
1   Phone       Mac
1   Phone       XiaoMi
1   Phone       HuaWei
2   Pad         Mac
2   Pad         HuaWei

方法二、直接对Brands_rank列进行分割(split),再堆叠(stack)处理,堆叠后会出现多级索引,删除多级索引后再拼接。3行拆分为8行的结果如下:

df_index = df.Brands_rank.str.split('-', expand=True).stack().to_frame() 
df_index = df_index.reset_index(level=1, drop=True).rename(columns={0:'Brands'}) 

df[['Type']].join(df_index) 

    Type        Brands
0   Computer    Mac
0   Computer    Dell
0   Computer    Lenovo
1   Phone       Mac
1   Phone       XiaoMi
1   Phone       HuaWei
2   Pad         Mac
2   Pad         HuaWei

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值