一.数据透视.
1.1整理透视
df.pivot(index = ' ', columns = ' ',values = ' ')
这些参数传入的是原数据的列名。index如果不传入,会使用现有索引。columns作为新DataFrame的列,取去重的值,当列和索引的组合有多个值时会报错,需要用pd.pivot_table()进行操作。values作为新DataFrame的值,若指定多个,会形成多层索引,若不指定,会默认为所有剩余的列。
1.2聚合透视
df.pivot()只是对原数据的结构、显示形式做了变换。若要在数据透视过程中对值进行计算,可以使用pd.pivot_table()
margins:是否增加汇总行列
aggfunc可以为不同的列指定不同的计算方法,用字典的形式给出就可
2.数据堆叠 stack
2.1堆叠与解堆
堆叠示意:
解堆示意:
堆叠的操作:df.stack()
解堆操作:df.unstack()
2.2交叉表
交叉表是用于统计分组频率的特殊透视表。简单来说,就是将两列或多列中不重复的元素组成一个新的DataFrame,新数据的行和列交叉部分的值为其组合在原数据中的数量
pd.crosstab(index,columns,
values = None,rownames = None,
colnames = None,
aggfunc = None,margins = False,
margins_name:str = 'ALL',dropna:bool = True,
normalize = False)
index:传入列,作为新数据的索引
columns:传入列,作为新数据的列,新数据的列为此列的去重值
rownames:新数据和列名,默认为None,colnames为新数据和行名
margins:默认False,作用是是否添加行列边距
normalize:布尔值,{‘all’,’index’,’columns’}或{0,1},默认False,通过将所有值除以值得总和进行 归一化
2.3轴交换df.swapaxes()
df.swapaxes(axis1,axis2,copy = True)方法用来进行轴交换
df.swapaxes('index','cloumns') #行列交换,等价于df.T
df.swapaxes('columns','index',copy = True) #使生效
2.4数据融合
数据融合df.melt()是df.pivot()的逆操作函数,简单来说,是将指定的列铺开,放到行上名为variable(可指定)、值为value(可指定)列
该过程代码如下:
pd.melt(id_vars = None, #tuple,list或ndarray,用作标识变量的列
value_vars = None, #tuple,list,ndarray,要取消透视的列,如果未指定,则使用未设置为id_vars的所有列
var_name = 'variable', #scalar,用于变量列的名称,若为None,则使用frame.columns.name或variable
value_name = 'value', #scalar,默认为‘value’,用于'value'列的名称
col_level = None #int或str,如果列是多层索引,则使用此级别来融合)
3.虚拟变量
虚拟变量(dummy variable)又称虚设变量、名义变量或哑变量,通常取值为0或1,常被用于one-hot特征提取
生成虚拟变量的方法pd.get_dummies()是将一列或者多列的去重值作为新表的列,每列的值由0或1组成,如果原来位置的值与列名相同,则在新表中该位置的值为1,否则为0.这样就形成了一个由0或1组成的特征矩阵。
语法为:
pd.get_dummies(data,
prefix = None, #新列的前缀
prefix_sep = '_', #新列前缀的连接符
dummy_na = False,
columns = None,
sparse = False,
drop_first = False,
dtype = None)
4.因子化
因子化是指将一个存在大量重复值的一维数据解析成枚举值的过程,这样可以方便我们分辨,factorize既可以用作顶层函数pd.factorize(),也可以用作Series.factorize()和Index.factorize()方法
对数据进行因子化后返回两个值,一个是因子化后的编码列表,另一个是原数据的去重值列表
in:
data = ['b','b','a','c','b']
#因子化
codes,uniques = pd.factorize(data)
#编码
codes
out:
array([0, 0, 1, 2, 0], dtype=int64)
in:
#去重值
uniques
out:
array(['b', 'a', 'c'], dtype=object)
上例中,将数据data进行因子化,返回一个由两个元素组成的元组。分别用codes和uniques来承接这个元组的元素
codes:数字编码表,将第一个元素编为0,其后依次为1,2,….。相同元素编码相同
uniques:去重值,也就是因子
以上数据是可迭代的array类型
对Series操作后唯一值将生成一个index对象
缺失值不会出现在唯一值列表中,在编码中将为-1
也可以引参数 sort = True。来对唯一值进行排序
Pandas的枚举类型数据categorical也可以使用此方法
in:
cat = pd.Categorical(['a','a','c'],categories = ['a','b','c'])
codes,uniques = pd.factorize(cat, sort = True)
codes
uniques
out:
array([0, 0, 1], dtype=int64)
['a', 'c']
Categories (3, object): ['a', 'b', 'c']
5.爆炸列表
将类似列表的每个元素转换为一行,索引值是相同的。
in:
s = pd.Series([[1,2,3],'foo',[],[3,4]])
s
out:
0 [1, 2, 3]
1 foo
2 []
3 [3, 4]
dtype: object
in:
s.explode()
out:
0 1
0 2
0 3
1 foo
2 NaN
3 3
3 4
dtype: object
每行列表中的元素都独自占用了一行,而索引保持不变,空值变成了NaN,非列表的元素没有变化
在DataFrame中爆炸指定列后,其他列的值会保持不变
Original: https://blog.csdn.net/m0_73598509/article/details/127577610
Author: 起风了xxx
Title: [pandas]数据重塑与透视
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/741690/
转载文章受原作者版权保护。转载请注明原作者出处!