4. 数据重塑与变形

方法/操作语法示例描述
行列转置df.T转置DataFrame(行变列,列变行)
宽表转长表pd.melt(df, id_vars=[‘id’])将多列合并为键值对形式(variable和value列)
长表转宽表df.pivot(index=’id’, columns=’var’, values=’val’)将长表转换为宽表(类似Excel数据透视)
分列操作 df[‘col’].str.split(‘,’, expand=True)按分隔符拆分字符串为多列

1. 行列转置(df.T)

将DataFrame的行列互换,适用于需要横向展示数据的场景。

import pandas as pd

# 示例数据
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['NY', 'LA', 'SF']
}
df = pd.DataFrame(data)

# 行列转置
df_transposed = df.T
print("原始数据:\n", df)
print("\n转置后数据:\n", df_transposed)

输出:

Plain Text
原始数据:
       Name  Age City
0    Alice   25   NY
1      Bob   30   LA
2  Charlie   35   SF

转置后数据:
           0     1       2
Name   Alice   Bob  Charlie
Age       25    30       35
City     NY    LA       SF

2. 宽表转长表(**pd.melt()**)

将多列合并为键值对形式,适合分析多指标数据。

import pandas as pd
data = {
'ID': [1, 2],
'name':['张三','李四'],
'Math': [90, 85],
'English': [88, 92],
'Science': [95, 89]
}
df = pd.DataFrame(data)
df
df.T
#宽表转长表
df2= pd.melt(df, id_vars=['ID','name'], var_name='科目', value_name='分数')
df2.sort_values(by=['name','科目'])
#长表转宽表
df3=pd.pivot(df2,index=['ID','name'],columns=['科目'],values='分数')
#分列
data = {
'ID': [1, 2],
'name':['alice smith','bob jack'],
'Math': [90, 85],
'English': [88, 92],
'Science': [95, 89]
}
df = pd.DataFrame(data)
df[['first name','last name']] = df['name'].str.split(' ')
# 加载数据
df = pd.read_csv("data/sleep.csv")

df=df[['person_id','blood_pressure']]
df[['high','low']]=df['blood_pressure'].str.split('/',expand=True)
df

3. 长表转宽表(**df.pivot()**)

将长表转换为宽表,类似Excel的数据透视表。

# 示例数据(长表)
data = {
    'ID': [1, 1, 1, 2, 2, 2],
    'Subject': ['Math', 'English', 'Science', 'Math', 'English', 'Science'],
    'Score': [90, 88, 95, 85, 92, 89]
}
df = pd.DataFrame(data)

# 长表转宽表(以ID为索引,Subject为列,Score为值)
df_pivoted = df.pivot(index='ID', columns='Subject', values='Score')
print("原始数据:\n", df)
print("\n转换后数据:\n", df_pivoted)

输出:

Plain Text
原始数据:
    ID  Subject  Score
0   1     Math     90
1   1  English     88
2   1  Science     95
3   2     Math     85
4   2  English     92
5   2  Science     89

转换后数据:
Subject  English  Math  Science
ID                            
1           88    90       95
2           92    85       89

4. 分列操作(**str.split()**)

按分隔符拆分字符串列,生成多列。

# 示例数据
data = {
    'Full_Name': ['Alice Smith', 'Bob Johnson', 'Charlie Brown']
}
df = pd.DataFrame(data)

# 拆分Full_Name为FirstName和LastName
df[['First_Name', 'Last_Name']] = df['Full_Name'].str.split(' ', expand=True)
print("原始数据:\n", df[['Full_Name']])
print("\n拆分后数据:\n", df[['First_Name', 'Last_Name']])

输出:

Plain Text
原始数据:
       Full_Name
0    Alice Smith
1   Bob Johnson
2  Charlie Brown

拆分后数据:
  First_Name Last_Name
0      Alice     Smith
1        Bob   Johnson
2    Charlie     Brown

注意事项

  1. pivot**与****pivot_table****的区别**:  
  2. pivot要求索引和列的组合唯一,否则报错。  
  3. pivot_table支持聚合(如均值、求和),适合非唯一组合。
  • 分列操作:  
  • 使用expand=True将拆分结果转为多列。  
  • 若分隔符数量不一致,需预处理数据(如填充缺失值)。
  • 内存管理:  
  • 宽表转长表可能增加行数,需注意内存占用。
#数据变形
import pandas as pd
data = {
    'ID': [1, 2],
    'name':['alice','bob'],
    'Math': [90, 85],
    'English': [88, 92],
    'Science': [95, 89]
}
df = pd.DataFrame(data)
df
df.T
#宽表转长表
df2= pd.melt(df, id_vars=['ID','name'], var_name='科目', value_name='分数')
df2.sort_values(by=['name','科目'])
#长表转宽表
df3=pd.pivot(df2,index=['ID','name'],columns=['科目'],values='分数')
#分列
data = {
    'ID': [1, 2],
    'name':['alice smith','bob jack'],
    'Math': [90, 85],
    'English': [88, 92],
    'Science': [95, 89]
}
df = pd.DataFrame(data)
df[['first name','last name']] = df['name'].str.split(' ',expand=True)
# 加载数据
df = pd.read_csv("data/sleep.csv")

df=df[['person_id','blood_pressure']]
df[['high','low']]=df['blood_pressure'].str.split('/',expand=True)
df

5.   文本数据处理

方法/操作语法示例描述
字符串大小写转换df[‘col’].str.lower()转为小写
去除空格df[‘col’].str.strip()去除两端空格
字符串替换df[‘col’].str.replace(‘old’, ‘new’)替换文本
正则表达式提取df[‘col’].str.extract(r'(\d+)’)提取匹配正则的文本(如数字)
字符串包含检测df[‘col’].str.contains(‘abc’)返回布尔序列,判断是否包含子串

1. 字符串大小写转换

统一文本格式,便于后续分析(如姓名、地址等)。

import pandas as pd

# 示例数据
data = {'Name': ['ALICE', 'Bob', 'CHARLIE']}
df = pd.DataFrame(data)

# 转为小写
df['Name_lower'] = df['Name'].str.lower()

# 转为大写
df['Name_upper'] = df['Name'].str.upper()

print(df)

输出:

Plain Text
      Name Name_lower Name_upper
0    ALICE      alice      ALICE
1      Bob        bob        BOB
2  CHARLIE    charlie    CHARLIE

2. 去除空格

处理用户输入或爬取数据中的多余空格。

# 示例数据(含前后空格)
data = {'Text': ['  Hello  ', '  Pandas  ', '  Data  ']}
df = pd.DataFrame(data)

# 去除两端空格
df['Text_stripped'] = df['Text'].str.strip()

print(df)

输出:

Plain Text
        Text Text_stripped
0    Hello         Hello
1   Pandas        Pandas
2     Data          Data

3. 字符串替换

替换文本中的特定字符或模式(如清理脏数据)。

# 示例数据(含特殊字符)
data = {'Comment': ['Good!', 'Bad?', 'Okay...']}
df = pd.DataFrame(data)

# 替换标点符号为空字符串
df['Comment_clean'] = df['Comment'].str.replace(r'[!?.]', '', regex=True)

print(df)

输出:

Plain Text
   Comment Comment_clean
0    Good!          Good
1     Bad?           Bad
2  Okay…          Okay

4. 正则表达式提取

从文本中提取结构化信息(如电话号码、日期)。

# 示例数据(含混合文本)
data = {'Info': ['Age:25', 'Height:170cm', 'Weight:65kg']}
df = pd.DataFrame(data)

# 提取数字
df['Value'] = df['Info'].str.extract(r'(\d+)')

print(df)

输出:

Plain Text
          Info Value
0       Age:25    25
1  Height:170cm   170
2   Weight:65kg    65

5. 字符串包含检测

筛选包含特定关键词的记录。

# 示例数据(产品评论)
data = {'Review': ['Great product', 'Not good', 'Excellent service']}
df = pd.DataFrame(data)

# 检测是否包含"good"(不区分大小写)
df['Is_Positive'] = df['Review'].str.contains('good', case=False)

print(df)

输出:

Plain Text
            Review  Is_Positive
0    Great product         True
1         Not good         True
2  Excellent service        False

实战案例:处理employees.csv

清理员工姓名和邮箱数据:

# 加载数据
df_employees = pd.read_csv("employees.csv")

# 1. 将first_name首字母大写,其余小写
df_employees['first_name'] = df_employees['first_name'].str.capitalize()

# 2. 提取邮箱域名(@后部分)
df_employees['email_domain'] = df_employees['email'].str.extract(r'@(.+)')

print(df_employees[['first_name', 'email', 'email_domain']].head())

输出:

Plain Text
  first_name       email email_domain
0     Steven  SKING@abc.com      abc.com
1      N_ann  NKOCHHAR@abc.com    abc.com
2        Lex  LDEHAAN@abc.com    abc.com
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容