wide_to_long
函数是pandas自带的,是对melt的一种补充,在特殊的宽转长情况下更适用。
pandas.wide_to_long(df, stubnames, i, j, sep=’’, suffix=’\d+’)
- df:[pd.dataframe],宽型数据框
- stubnames:[str,list-like],列名中的存根名字
- i:[str,list-like],列中的索引变量
- j:[str],后缀的重命名
- sep:[str,default “”],存根名与后缀之间的分隔符
- suffix:[str,default “\d+”],后缀
s_df = pd.DataFrame({"A1970" : [1,33,3],
"B1980" : [3,5,7],
"A1980" : [13,15,17],
"B1970" : [6,8,14],
"x" : [1,2,3],
"y" : [4,5,6]})
A1970 B1980 A1980 B1970 x y
0 1 3 13 6 1 4
1 33 5 15 8 2 5
2 3 7 17 14 3 6
在数据中,A1970
,B1980
,A1980
,B1970
这几列名字具有相同的结构,如果需要将它们分开,就可以用long_to_wide
函数。
pd.wide_to_long(s_df,stubnames=['A','B'],j='year',i='x')
y A B
x year
1 1970 4 1 6
1980 4 13 3
2 1970 5 33 8
1980 5 15 5
3 1970 6 3 14
1980 6 17 7
- 设置
stubnames
,函数会根据设置的字符去数据列中匹配目标列,然后转换为长数据
pd.wide_to_long(s_df,stubnames=['A',],j='year',i='x')
B1970 y B1980 A
x year
1 1970 6 4 3 1
2 1970 8 5 5 33
3 1970 14 6 7 3
1 1980 6 4 3 13
2 1980 8 5 5 15
3 1980 14 6 7 17
如果stubnames
参数设置的字符在原数据框的列中无法找到,则返回空数据框。
pd.wide_to_long(s_df,stubnames=['C',],j='year',i='x')
Empty DataFrame
Columns: [B1970, y, A1980, B1980, A1970, C]
Index: []
pd.wide_to_long(s_df,stubnames=['A','B'],j='year',i=['x','y'])
A B
x y year
1 4 1970 1 6
1980 13 3
2 5 1970 33 8
1980 15 5
3 6 1970 3 14
1980 17 7
- 参数
sep
表示分隔符,默认""
,可以根据实际情况设置。
sep_df = pd.DataFrame({"A-1970" : [1,33,3],
"B-1980" : [3,5,7],
"A-1980" : [13,15,17],
"B-1970" : [6,8,14],
"x" : [1,2,3],
"y" : [4,5,6]})
sep_df
A-1970 B-1980 A-1980 B-1970 x y
0 1 3 13 6 1 4
1 33 5 15 8 2 5
2 3 7 17 14 3 6
数据中列名的分隔符为-
,则转换的时候需要设置sep='-'
。
pd.wide_to_long(sep_df,stubnames=['A','B'],j='year',i='x',sep='-')
y A B
x year
1 1970 4 1 6
1980 4 13 3
2 1970 5 33 8
1980 5 15 5
3 1970 6 3 14
1980 6 17 7
- 参数
suffix
表示后缀,默认是"\d+"
,是正则表达式,表示匹配数字,可以根据实际情况替换。
suf_df = pd.DataFrame({"Aone" : [1,33,3],
"Btwo" : [3,5,7],
"Atwo" : [13,15,17],
"Bone" : [6,8,14],
"x" : [1,2,3],
"y" : [4,5,6]})
suf_df
Aone Btwo Atwo Bone x y
0 1 3 13 6 1 4
1 33 5 15 8 2 5
2 3 7 17 14 3 6
pd.wide_to_long(suf_df,stubnames=['A','B'],j='year',i='x',suffix='(one|two)')
y A B
x year
1 one 4 1 6
two 4 13 3
2 one 5 33 8
two 5 15 5
3 one 6 3 14
two 6 17 7
长型数据转为宽型数据可以通过透视的功能实现,类似于excel中的透视表功能。在pandas中用pivot
方法实现。
DataFrame.pivot(index=None, columns=None, values=None)
- index:[str ,object ,a list of str],透视的索引
- columns:[str ,object ,a list of str],透视的列
- values:[str, object ,a list of the previous],透视的值
l_df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two','two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'cat':['alpha','alpha','alpha','beta','beta','beta'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': [4, 6, 8, 1, 2, 9]})
foo bar cat baz zoo
0 one A alpha 1 4
1 one B alpha 2 6
2 one C alpha 3 8
3 two A beta 4 1
4 two B beta 5 2
5 two C beta 6 9
选择foo
列作为透视后的索引,bar
列作为透视的列,里面的元素会展开成新数据框的列,baz
作为透视的值,填充在新数据框中。
l_df.pivot(index='foo',columns='bar',values='baz')
bar A B C
one 1 2 3
two 4 5 6
- 设置
index
为多个列名,透视表将具有多个行索引。
l_df.pivot(index=['foo','bar'],columns='cat',values='baz')
cat alpha beta
foo bar
one A 1.0 NaN
B 2.0 NaN
C 3.0 NaN
two A NaN 4.0
B NaN 5.0
C NaN 6.0
- 设置
columns
为多个列名,透视表将具有多个列索引。
l_df.pivot(index='foo',columns=['bar','cat'],values='baz')
bar A B C A B C
cat alpha alpha alpha beta beta beta
one 1.0 2.0 3.0 NaN NaN NaN
two NaN NaN NaN 4.0 5.0 6.0
l_df.pivot(index='foo',columns='bar',values=['baz','zoo'])
baz zoo
bar A B C A B C
one 1 2 3 4 6 8
two 4 5 6 1 2 9
长型数据(long format dataframe)与宽型数据(wide format dataframe)是两种形式的数据框,在数据分析中高频出现,在数据处理过程中,常常需要在两者之间相互转换。本文基于pandas,介绍长型数据与宽型数据的相互转换操作。环境python3.9win10 64bitpandas==1.2.1宽转长在pandas中,宽型转长型数据有melt和wide_to_long两种方法。meltmelt方法叫做数据融合,是dataFrame拥有的方法,使用较为.
#将"姓名"和"科目"设置为索引, 然后取出"分数"这一列, 得到的对应的具有二级索引的Series对象
two_level_index_series = df.set_index([“姓名”, “科目”])[“分数”]
此时得到的Series就是一个具有二级索引的Series
一级索引就是"姓名"这一列, 二级索引就是"科目"这一列
print(two_level_index_series)
什么是长表?什么是宽表?这个概念是对于某一个特征而言的。
例如:一个表中把性别存储在某一个列中,那么它就是关于性别的长表;
如果把性别作为列名,列中的元素是某一其他的相关特征数值,那么这个表是关于性别的宽表。
# 下面的两张表就分别是关于性别的长表:
pd.DataFrame({'Gender':['F','F','M','M'], 'Height':[163, 160, 17
Pandas的基础数据结构Series和DataFrame。若是还不清楚的可以再去看看我之前的博客详细介绍这两种数据结构的处理方法:
一文速学-数据分析之Pandas数据结构和基本操作代码
一文速学-Pandas实现数值替换、排序、排名、插入和区间切片
一些Pandas基础函数的使用方法:
DataFrame行列表查询操作详解+代码实战
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
Pandas中read_excel函数参数使用详解+实例代码...
import pandas as pd
# 读取movie数据集,选取所有演员名和其Facebook likes
movie = pd.read_csv('data/movie.csv')
actor = movie[['movie_title', 'actor_1_name', 'actor_2_name', 'actor_3_name',
'actor_1_facebook_likes', 'actor_2_facebook_likes', 'actor_3_faceb.
data = pd.read_csv('d:data/macrodata.csv')
print 'data:=\n', data
print 'data.to_records():=\n', data.to_records()
print 'data.
在 Pandas 中使用 groupby 函数可以对数据进行分组。可以指定一个或多个列作为分组键,然后进行聚合操作。
如果要删除分组后重复的行,可以在 groupby 函数后使用 drop_duplicates() 方法。
import pandas as pd
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 3,
'B': [1, 2, 3] * 3,
'C': [4, 5, 6] * 3})
# 首先按 'A' 和 'B' 分组
grouped = df.groupby(['A', 'B']).sum()
# 删除分组后重复的行
grouped = grouped.drop_duplicates()
这将会返回一个新的 dataframe,里面没有重复行。