[pandas]数据重塑与透视

一.数据透视.

1.1整理透视

df.pivot(index = ' ', columns = ' ',values = ' ')

这些参数传入的是原数据的列名。index如果不传入,会使用现有索引。columns作为新DataFrame的列,取去重的值,当列和索引的组合有多个值时会报错,需要用pd.pivot_table()进行操作。values作为新DataFrame的值,若指定多个,会形成多层索引,若不指定,会默认为所有剩余的列。

1.2聚合透视

df.pivot()只是对原数据的结构、显示形式做了变换。若要在数据透视过程中对值进行计算,可以使用pd.pivot_table()

[pandas]数据重塑与透视

margins:是否增加汇总行列

aggfunc可以为不同的列指定不同的计算方法,用字典的形式给出就可

2.数据堆叠 stack

2.1堆叠与解堆

堆叠示意:

[pandas]数据重塑与透视

[pandas]数据重塑与透视

解堆示意:

[pandas]数据重塑与透视

堆叠的操作: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(可指定)列

[pandas]数据重塑与透视

该过程代码如下:

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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球