Python pandas 列转行操作详解(类似hive中explode方法)

  • Post category:Python

下面是关于“Python pandas列转行操作详解(类似hive中explode方法)”的完整攻略。

什么是列转行操作

列转行操作指的是将表格数据按照某一列进行拆分,同时将这一列所在的行进行复制,然后将新拆出来的行合并到原表格中。这个操作在Hive中有一个名为explode的方法,而在Python中,我们可以借助pandas实现类似的操作。

Pandas列转行操作的方法

在Python中,我们可以使用pd.melt()函数实现列转行操作。pd.melt()函数的语法如下:

pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

其中,各参数的含义如下:

  • frame:需要操作的数据框
  • id_vars:保持原来不动的列
  • value_vars:需要转换为变量值的列
  • var_name:转换后的变量名,默认为variable
  • value_name:转换后的值名,默认为value
  • col_level:如果列是MultiIndex,则使用此级别。

下面,我们通过两个具体的例子来详细说明pd.melt()函数的用法。

示例1:列转行操作

假设我们有如下的一张表格:

name math English science
Alice 90 87 92
Bob 88 92 89
Cathy 92 85 91

我们想要将该表格按照科目进行拆分,同时保留学生姓名,得到以下结果:

name subject score
Alice math 90
Alice English 87
Alice science 92
Bob math 88
Bob English 92
Bob science 89
Cathy math 92
Cathy English 85
Cathy science 91

我们可以通过如下代码来实现:

import pandas as pd

# 构造原数据框
df = pd.DataFrame({
        'name': ['Alice', 'Bob', 'Cathy'],
        'math': [90, 88, 92],
        'English': [87, 92, 85],
        'science': [92, 89, 91]
    })

# 对数据框进行列转行操作
melted = pd.melt(df, id_vars=['name'], var_name='subject', value_name='score')

# 输出结果
print(melted)

运行代码后,输出结果与上述的转换后的表格一致。

示例2:列转行+统计

假如我们有一张用户表格,其中包括用户ID和用户所购买的商品列表。我们需要统计每个商品被购买了多少次,该怎么实现呢?

user_id items
1 A,B,C
2 B,C
3 A,B,D

我们可以先使用pd.melt()函数进行列转行操作,将items列拆分成多行,最终得到如下结果:

user_id variable value
1 items A
1 items B
1 items C
2 items B
2 items C
3 items A
3 items B
3 items D

接着,我们可以按照value列进行统计,最终得到每个商品被购买的次数。

# 构造原数据框
df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'items': ['A,B,C', 'B,C', 'A,B,D']
})

# 按照逗号对items列进行拆分,并进行列转行操作
items = df['items'].str.split(',', expand=True).stack().reset_index(level=1, drop=True)
items.name = 'item'
df = df.drop('items', axis=1).join(items).reset_index(drop=True)

# 统计每个商品的购买次数,并输出结果
print(df.groupby('item').count())

运行代码后,输出结果如下:

      user_id
item         
A           2
B           3
C           2
D           1

上述代码中,我们首先使用df[‘items’].str.split(‘,’, expand=True)将items列按逗号拆分成多列。接着,我们使用stack()将多列中的值堆叠成一列,并用reset_index将堆叠后的列转换为DataFrame。最后,我们在原数据框中删除items列,并将items转换的新列join到数据框中,并按照item列进行分组统计。最终,我们得到每件商品被购买的次数。

以上就是关于Python pandas列转行操作的详细攻略了。希望能对你有所帮助。