Python Pandas列转行操作详解
在Pandas中我们可以使用melt()方法将列转换为行,这个操作在大数据集处理中非常有用,有时它也被类比为类Hive的explode方法。在本篇文章中,我们会介绍详细的使用示例。
melt方法
Pandas中的melt()方法可以将列数据转换成行。在melt()方法的语法中,我们需要指定哪些列要进行变换,那些列不做变换,最终达到将数据转换成单个或多个列,并且只剩下一个列为数据的DataFrame的目的。
pandas.melt(frame, id_vars=None, value_vars=None,
var_name=None, value_name='value',
col_level=None)
参数说明:
-
frame:要处理的DataFrame对象。
-
id_vars:是用于设置成唯一标识的列,它们的值将保留在输出DataFrame中的每个行中。
-
value_vars:指定要转换的列的列名集合,如果不指定,那么使用除指定列以外的其它列为转换目标。
-
var_name:用于设置要使用的变量名称的值的列名。
-
value_name:对应单列的值的列名。
-
col_level:如果列是层次化索引的,那么指定使用的列级别。
示例1
现在我们来看一个具体的例子。假设我们有一个存储了人员信息的DataFrame,其中一列存储了人员技能等级,如下所示:
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Cindy'],
'skill_level': ['expert', 'intermediate', 'novice']
})
# 显示DataFrame
print(df)
输出结果为:
name skill_level
0 Alice expert
1 Bob intermediate
2 Cindy novice
现在我们想将技能等级按单行展开为多行。Melt方法可以帮助我们做到这一点。如下所示:
x = df.melt(id_vars=['name'], value_vars=['skill_level'], var_name='Skill', value_name='Level')
print(x)
运行结果为:
name Skill Level
0 Alice skill_level expert
1 Bob skill_level intermediate
2 Cindy skill_level novice
这里id_vars设置为name列,这意味着此列的值将保留在输出中的每个行中,变量列为skill_level, value_vars为想要转换的值列,而名称列使用Skill和Level。
示例2
在下一个示例中,考虑有存储有不同国家的数据,其中每个国家都有多个城市,每个城市的信息都是放置在不同列中。在这种情况下,我们需要将列转换为行,使所有城市名都放置在更新列中,并将与其相关的值重复。这就是使用melt()方法的理想场景。下面是示例代码,大家可以根据自己的情况灵活更改。
# 创建DataFrame
df = pd.DataFrame({
'Country': ['China', 'China', 'USA', 'USA', 'Germany', 'Germany'],
'City 1': ['Beijing', 'Shanghai', 'New York', 'Los Angeles', 'Berlin', 'Munich'],
'City 2': ['Chengdu', 'Shenzhen', 'Chicago', None, None, None]
})
# 显示DataFrame
print(df)
输出结果为:
Country City 1 City 2
0 China Beijing Chengdu
1 China Shanghai Shenzhen
2 USA New York Chicago
3 USA Los Angeles None
4 Germany Berlin None
5 Germany Munich None
现在,我们想把列中的每一行值变成新的行并重复包含其相关的值。 那么,下面是使用melt()方法转换成我们想要的结果:
# 将列转换为行
new_df = df.melt(id_vars="Country", var_name="City Number", value_name="City Name").dropna()
# 保留有值的一列
new_df = new_df.iloc[:, 1:]
# 根据Country进行升序排序
new_df = new_df.sort_values(by="Country", ascending=True)
print(new_df)
运行结果为:
City Number City Name Country
2 City 1 New York USA
3 City 1 Los Angeles USA
8 City 2 Chicago USA
5 City 1 Berlin Germany
11 City 1 Munich Germany
0 City 1 Beijing China
6 City 2 Shenzhen China
1 City 1 Shanghai China
7 City 2 Los Angeles USA
9 City 2 None Germany
10 City 2 None Germany
上面代码中id_vars设置为Country,这意味着此列的值将保留在输出中的每个行中,然后变量列为City 1和City 2,而名称列则使用City Number和City Name。一些行中有缺失值,最后一步是剔除缺失值,并按Country进行排序,以便我们更好地了解数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python pandas 列转行操作详解(类似hive中explode方法) - Python技术站