| 方法/操作 | 语法示例 | 描述 |
| 行列转置 | 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 |
注意事项
- pivot**与****pivot_table****的区别**:
- pivot要求索引和列的组合唯一,否则报错。
- 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











请登录后查看评论内容