一、生成数据表
1.1.文件读取
1.1.1.导入Excel文件
首先导入pandas库,一般都会用到numpy库先导入,导入CSV或者xlsx文件:
import numpy as np
import pandas as pd
# 读取 Excel 文件,从第 4 行开始(跳过前 3 行),只读取第 B 列到第 E 列
df1 = pd.DataFrame(pd.read_excel('零售订单数据.xlsx', sheet_name='orderinfo', skiprows=3, usecols='B:E'))
print(df1)
这段代码使用了 pandas
库中的 read_excel
函数来读取 Excel 文件 '零售订单数据.xlsx'
中的特定工作表 'orderinfo'
。以下是参数的作用和含义:
-
'零售订单数据.xlsx'
:这是要读取的 Excel 文件的文件名。 -
sheet_name='orderinfo'
:指定要读取的工作表的名称为'orderinfo'
。如果 Excel 文件中有多个工作表,可以通过这个参数选择要读取的工作表。如果不指定sheet_name
,默认会读取第一个工作表。 -
skiprows=3
:跳过前面的 3 行数据。在这个例子中,从第四行开始读取数据(因为索引是从0开始计算的)。 -
usecols='B:E'
:指定要读取的列范围,从 B 列到 E 列。这意味着只有 B、C、D、E 四列的数据会被读取,而不会读取其他列的数据。
1.1.2.导入csv文件
pandas读取csv文件语法:
import pandas as pd
# 示例 CSV 文件路径
csv_file_path = 'data.csv'
# 读取 CSV 文件
df = pd.read_csv(csv_file_path, sep=',', header=0, names=None, index_col=None, skiprows=0, usecols=None, dtype=None, parse_dates=None, na_values=None)
# 打印数据框
print(df)
read_csv 函数的常用参数及其说明:
- filepath_or_buffer:
- 文件路径或 URL。
- 例子:'data.csv','http://example.com/data.csv'
- sep:
- 指定分隔符。
- 默认值是逗号(,)。
- 例子:sep=',',sep='\t'(制表符)
- header:
- 指定哪一行作为列名。
- 默认是 header=0,即第一行作为列名。
- 例子:header=0,header=None(无列名)
- names:
- 指定列名。
- 例子:names=['A', 'B', 'C']
- index_col:
- 指定哪一列作为行索引。
- 默认值是 None。
- 例子:index_col=0
- skiprows:
- 跳过前几行数据。
- 例子:skiprows=3(跳过前 3 行)
- usecols:
- 指定要读取的列。
- 例子:usecols=['A', 'B'] 或 usecols=[0, 1]
- dtype:
- 指定列的数据类型。
- 例子:dtype={'A': int, 'B': float}
- parse_dates:
- 解析日期列。
- 例子:parse_dates=['date']
- na_values:
- 指定哪些值被视为缺失值(NaN)。
- 例子:na_values=['NA', '?']
读取指定的 CSV 文件,并将其内容加载到一个 pandas
DataFrame 中:
import numpy as np
import pandas as pd
# 示例 CSV 文件路径
csv_file_path = 'large_sample_data.csv'
# 导入CSV文件:
df = pd.DataFrame(pd.read_csv(csv_file_path, sep=',', header=1, encoding='utf-8'))
print(df)
1.2.用pandas创建数据表
上一个章节已经说过了,就不在赘述了:
import numpy as np
import pandas as pd
df = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006],
"date": pd.date_range('20130102', periods=6),
"city": ['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age": [23, 44, 54, 32, 34, 32],
"category": ['100-A', '100-B', '110-A', '110-C', '210-A', '130-F'],
"price": [1200, np.nan, 2133, 5433, np.nan, 4432]},
columns=['id', 'date', 'city', 'category', 'age', 'price'])
"""
id date city category age price
0 1001 2013-01-02 Beijing 100-A 23 1200.0
1 1002 2013-01-03 SH 100-B 44 NaN
2 1003 2013-01-04 guangzhou 110-A 54 2133.0
3 1004 2013-01-05 Shenzhen 110-C 32 5433.0
4 1005 2013-01-06 shanghai 210-A 34 NaN
5 1006 2013-01-07 BEIJING 130-F 32 4432.0
"""
二、数据表信息查看
数据表信息查询如下:
- 维度查看:
- 数据表基本信息(维度、列名称、数据格式、所占空间等):
- 每一列数据的格式:
- 某一列格式:
- 空值:
- 查看某一列空值:
- 查看某一列的唯一值:
- 查看数据表的值:
- 查看列名称:
- 查看前5行数据、后5行数据
示例代码如下:
import numpy as np
import pandas as pd
# 创建示例 DataFrame
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, np.nan, 50],
'C': ['a', 'b', 'c', 'd', 'e']
}
index = ['row1', 'row2', 'row3', 'row4', 'row5']
df = pd.DataFrame(data, index=index)
# 输出 DataFrame
print("DataFrame 示例:")
print(df)
# 1.查看维度
print("\nDataFrame 的维度:")
print(df.shape) # (5, 3)
# 2. 查看数据表的基本信息
print("\nDataFrame 的基本信息:")
print(df.info())
# 3. 查看每一列数据的格式
print("\n每一列数据的格式:")
print(df.dtypes)
# 4. 查看某一列的数据格式
print("\n列 'A' 的数据格式:")
print(df['A'].dtype)
# 5. 查看每一列的空值数量
print("\n每一列的空值数量:")
print(df.isnull().sum())
# 6. 查看某一列的空值位置
print("\n列 'B' 的空值位置:")
print(df['B'].isnull())
# 7. 查看某一列的唯一值
print("\n列 'C' 的唯一值:")
print(df['C'].unique())
# 8. 查看 DataFrame 的所有值
print("\nDataFrame 的所有值:")
print(df.values)
# 9. 查看 DataFrame 的列名称
print("\nDataFrame 的列名称:")
print(df.columns)
# 10. 查看前5行数据
print("\nDataFrame 的前5行数据:")
print(df.head())
# 10. 查看后5行数据
print("\nDataFrame 的后5行数据:")
print(df.tail())
三、数据表清洗
利用pandas中数据表清洗,往往需要进行如下处理:
- 用数字0填充空值:
df.fillna(value=0)
- 使用列prince的均值对NA进行填充:
df['prince'].fillna(df['prince'].mean())
- 清除city字段的字符空格:
df['city']=df['city'].map(str.strip)
- 大小写转换:
df['city']=df['city'].str.lower()
- 更改数据格式:
df['price'].astype('int')
- 更改列名称:
df.rename(columns={'category': 'category-size'})
- 删除后出现的重复值:
df['city'].drop_duplicates()
- 删除先出现的重复值:
df['city'].drop_duplicates(keep='last')
- 数据替换:
# 替换单个值
df_replaced['city'] = df_replaced['city'].replace('Shanghai', 'sh')
# 同时替换多个值
df_replaced.replace({'city': {'Shanghai': 'sh', 'Shenzhen':'sz', 'Guangzhou': 'gz', 'Beijing':'bj'}}, inplace=True)
示例代码:
import numpy as np
import pandas as pd
# 创建示例 DataFrame
data = {
'price': [10, np.nan, 30, 40, np.nan, 50],
'city': [' Shanghai', 'Beijing ', 'Shenzhen', 'Guangzhou', 'Shanghai', 'sh'],
'category': ['A', 'B', 'A', 'B', 'A', 'A']
}
index = ['row1', 'row2', 'row3', 'row4', 'row5', 'row6']
df = pd.DataFrame(data, index=index)
# 输出 DataFrame
print("DataFrame 示例:")
print(df)
"""
price city category
row1 10.0 Shanghai A
row2 NaN Beijing B
row3 30.0 Shenzhen A
row4 40.0 Guangzhou B
row5 NaN Shanghai A
row6 50.0 sh A
"""
# 1. 用数字0填充空值
# df_filled_with_zero = df.fillna(value=0)
# print("\n用数字0填充空值:")
# print(df_filled_with_zero)
# 2. 使用列 price 的均值对 NA 进行填充
df_filled_with_mean = df.copy()
# 将数据表df_filled_with_mean中price列中的缺失值(NaN)用该列的均值填充
df_filled_with_mean['price'] = df_filled_with_mean['price'].fillna(df_filled_with_mean['price'].mean())
"""
df_filled_with_mean['price']:选择数据表df_filled_with_mean中的price列。
df_filled_with_mean['price'].mean():计算price列的均值。
df_filled_with_mean['price'].fillna(df_filled_with_mean['price'].mean()):将price列中的缺失值(NaN)用该列的均值填充。
"""
print("\n使用列 price 的均值对 NA 进行填充:")
print(df_filled_with_mean)
# 3. 清除 city 字段的字符空格
df_strip = df.copy()
"""
将数据表df_strip中city列中的每个元素(字符串)去除首尾空格,并更新到city列中
map方法常用于对列中的元素进行清洗、转换或处理,例如去除空格、转换数据类型、进行数值计算等操作
经过map方法处理后,会生成一个新的列,其中包含了每个元素经过函数处理后的结果。
"""
df_strip['city'] = df_strip['city'].map(str.strip)
print("\n清除 city 字段的字符空格:")
print(df_strip)
# 4. 大小写转换(两种写法均可)
df_lower = df.copy()
# df_lower['city'] = df_lower['city'].map(str.lower)
df_lower['city'] = df_lower['city'].str.lower()
print("\n将 city 字段转换为小写:")
print(df_lower)
# 5. 更改数据格式
df_format_change = df.fillna(value=0) # 先将NaN转换为0, 否则下面无法将price转换为int类型
# 将price列类型转换为int类型
df_format_change['price'] = df_format_change['price'].astype('int')
print("\n更改 price 列的数据格式为 int:")
print(df_format_change)
# 6. 更改列名称(将price改为price_new)
df_renamed = df.copy()
df_renamed.rename(columns={'price': 'price_new'}, inplace=True)
print("\n更改列名称:")
print(df_renamed)
# 7. 删除后面出现的重复值 (保留第一次出现的)
df_no_duplicates_last = df['category'].drop_duplicates() # 指定删除category列中重复值 (保留第一次出现的)
print("\n删除后出现的重复值 (保留第一次出现的):")
print(df_no_duplicates_last)
# 8. 删除先出现的重复值 (保留最后一次出现的)
df_no_duplicates_first = df['category'].drop_duplicates(keep='last')
print("\n删除先出现的重复值 (保留最后一次出现的):")
print(df_no_duplicates_first)
# 9. 数据替换
df_replaced = df.copy()
# 先将city中值的左右空格去掉,否则后面替换会出现匹配出错
df_replaced['city'] = df_replaced['city'].map(str.strip)
# 将Shanghai替换为sh, 可以同时替换多个值:df_replaced.replace({'city': {'Shanghai': 'sh', 'Shenzhen':'sz', 'Guangzhou': 'gz', 'Beijing':'bj'}}, inplace=True)
df_replaced.replace({'city': {'Shanghai': 'sh'}}, inplace=True)
print("\n数据替换 ('sh' 替换为 'shanghai'):")
print(df_replaced)
四、数据预处理
4.1.数据表合并
⑴.merge
- 作用: 使用一个或多个键(key)连接 DataFrame。这类似于 SQL 中的合并操作。
- 含义: 根据指定的列或索引进行连接,可以指定不同的连接方式(如内连接、左连接、右连接、外连接)。
import pandas as pd
# 示例数据 df
df = pd.DataFrame({"id": [1001, 1002, 1003, 1004],
"name": ['Alice', 'Bob', 'Charlie', 'David'],
"age": [25, 30, 35, 40]})
df1 = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
"gender": ['male', 'female', 'male', 'female', 'male', 'female', 'male', 'female'],
"pay": ['Y', 'N', 'Y', 'Y', 'N', 'Y', 'N', 'Y', ],
"m-point": [10, 12, 20, 40, 40, 40, 30, 20]})
# 合并操作
df_inner = pd.merge(df, df1, on='id', how='inner') # 内连接,交集
df_left = pd.merge(df, df1, on='id', how='left') # 左连接,保留df所有行
df_right = pd.merge(df, df1, on='id', how='right') # 右连接,保留df1所有行
df_outer = pd.merge(df, df1, on='id', how='outer') # 外连接,并集
# 输出结果
print("内连接 (Inner Join):")
print(df_inner)
print("\n左连接 (Left Join):")
print(df_left)
print("\n右连接 (Right Join):")
print(df_right)
print("\n外连接 (Outer Join):")
print(df_outer)
执行输出如下:
⑵.join
- 作用: 将两个 DataFrame 基于它们的索引(index)连接。
- 含义: 基于索引对两个 DataFrame 进行连接,类似于 SQL 中的 JOIN 操作,默认是左连接。
案例代码:
import pandas as pd
# 示例数据
# 示例数据
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']}, index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2'], 'D': ['D0', 'D1', 'D2']}, index=['K0', 'K2', 'K3'])
print(left)
print(right)
# 使用 join 进行连接,这里指定成了内连接:
joined_df = left.join(right, how='inner')
print("使用 join 连接后的数据表:")
print(joined_df)
执行如下:
⑶.concat
concat:
- 作用: 沿指定轴(axis)将多个 DataFrame 连接在一起。
- 含义: 可以沿行或列方向将多个 DataFrame 连接在一起,通过指定轴向进行连接操作。
语法:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
参数:
- objs︰ 一个序列或系列、 综合或面板对象的映射。如果字典中传递,将作为键参数,使用排序的键,除非它传递,在这种情况下的值将会选择(见下文)。任何没有任何反对将默默地被丢弃,除非他们都没有在这种情况下将引发 ValueError。
- axis: {0,1,…},默认值为 0。要连接沿轴。
- join: {‘内部’、 ‘外’},默认 ‘外’。如何处理其他 axis(es) 上的索引。联盟内、 外的交叉口。
- ignore_index︰ 布尔值、 默认 False。如果为 True,则不要串联轴上使用的索引值。由此产生的轴将标记
- 0,…,n-1。这是有用的如果你串联串联轴没有有意义的索引信息的对象。请注意在联接中仍然受到尊重的其他轴上的索引值。
- join_axes︰ 索引对象的列表。具体的指标,用于其他 n-1 轴而不是执行内部/外部设置逻辑。 keys︰
- 序列,默认为无。构建分层索引使用通过的键作为最外面的级别。如果多个级别获得通过,应包含元组。
- levels︰ 列表的序列,默认为无。具体水平 (唯一值) 用于构建多重。否则,他们将推断钥匙。
- names︰ 列表中,默认为无。由此产生的分层索引中的级的名称。
- verify_integrity︰ 布尔值、 默认 False。检查是否新的串联的轴包含重复项。这可以是相对于实际数据串联非常昂贵。
- 副本︰ 布尔值、 默认 True。如果为 False,请不要,不必要地复制数据
案例代码:
import pandas as pd
# 示例数据
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})
"""
使用 concat 进行连接
在 pd.concat() 函数中,ignore_index=True 参数的含义是忽略原来的索引,生成一个新的从 0 开始的连续索引。
这在需要将多个 DataFrame 连接在一起时很有用,特别是当原始 DataFrame 的索引可能重复或者不连续时。
"""
concatenated_df = pd.concat([df1, df2], ignore_index=True)
print("使用 concat 连接后的数据表:")
print(concatenated_df)
如下:
4.2.设置索引列
当df.set_index('A', inplace=True)
的作用是将DataFrame中的某一列作为索引列,这里将'A'列作为索引列。设置索引列后,原来的整数索引将被替换,DataFrame的索引将变为'A'列的值。如果想要取消设置的索引列,可以使用df.reset_index(inplace=True)
方法来恢复默认的整数索引。这样就可以重新使用默认的整数索引进行取值操作了。
import pandas as pd
# 包含两列'A'和'B',分别对应数值1、2、3和数值4、5、6。
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df)
# 将DataFrame的索引列设置为'A'列的值,参数inplace=True表示在原DataFrame上进行操作,而不是返回一个新的DataFrame。
df.set_index('A', inplace=True)
print("\n设置索引列后的数据表:")
print(df)
# 通过.loc[]方法根据索引值取值
print(df.loc[1, 'B']) # 获取索引值为1的行的'B'列的值: 4
执行如下:
4.3.按照特定列的值排序(默认升序排列)
语法:
df_inner.sort_values(by=['age'])
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 按照 age 列排序
df_sorted_by_age = df_inner.sort_values(by='age')
print("\n按照'age'列排序后的DataFrame:")
print(df_sorted_by_age)
"""
age name city price category
2 20 小刚 广州 1500 A-15
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
3 35 小美 北京 3000 C-25
"""
说明:
-
df_inner.sort_values(by='age')
按照'age'列的值升序排序DataFramedf_inner
如果要按 age
列进行降序排序,可以这样写:
df_sorted_by_age_desc = df_inner.sort_values(by='age', ascending=False)
4.4.按照索引列排序
语法:
df_inner.sort_index()
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 按照 索引列 排序, 不设置默认是升序,可以添加参数ascending=False设置降序
df_sorted_by_index = df_inner.sort_index(ascending=False)
print("\n按照索引列排序后的DataFrame:")
print(df_sorted_by_index)
"""
按照索引列排序后的DataFrame:
age name city price category
3 35 小美 北京 3000 C-25
2 20 小刚 广州 1500 A-15
1 30 小红 上海 4000 B-20
0 25 小明 北京 2500 A-10
"""
说明:
-
df_inner.sort_index()
按照DataFramedf_inner
的索引升序排序。
4.5.如果prince列的值>3000,group列显示high,否则显示low:
语法:
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 根据 price 列条件添加group列
df_inner['group'] = np.where(df_inner['price'] > 3000, 'high', 'low')
print("\n添加'group'列后的DataFrame:")
print(df_inner)
说明:
-
np.where(df_inner['price'] > 3000, 'high', 'low')
根据条件将'price'列大于3000的行赋值为'high',否则赋值为'low',创建新列'group'
4.6.对复合多个条件的数据进行分组标记
语法:
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 根据多个条件添加'sign'列
df_inner.loc[(df_inner['city'] == '上海') & (df_inner['price'] >= 4000), 'sign'] = 1
print("\n添加'sign'列后的DataFrame:")
print(df_inner)
"""
添加'sign'列后的DataFrame:
age name city price category sign
0 25 小明 北京 2500 A-10 NaN
1 30 小红 上海 4000 B-20 1.0
2 20 小刚 广州 1500 A-15 NaN
3 35 小美 北京 3000 C-25 NaN
"""
说明:
-
df_inner.loc[(df_inner['city'] == '上海') & (df_inner['price'] >= 4000), 'sign'] = 1
对满足'城市为北京'且'价格大于等于4000'的行添加'sign'列,并赋值为1。
4.7.对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
语法:
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size'])
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 分割 category 列 并创建新DataFrame
data_split = pd.DataFrame((x.split('-') for x in df_inner['category']), index=df_inner.index, columns=['category', 'size'])
print("\n分割后的DataFrame:")
print(data_split)
说明:
-
pd.DataFrame((x.split('-') for x in df_inner['category']), index=df_inner.index, columns=['category', 'size'])
将'category'列按照'-'分割,创建新的DataFrame,列名为'category'和'size',索引与原始DataFramedf_inner
的索引对应。
4.8.将完成分裂后的数据表和原df_inner数据表进行匹配
pd.merge
是 pandas 中用于合并两个 DataFrame 的函数。它类似于 SQL 中的 JOIN 操作。下面是 pd.merge
函数的语法及其主要参数的说明:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
参数说明
- left: 第一个 DataFrame。
- right: 第二个 DataFrame。
- how: 合并方式,默认为
'inner'
。常用的合并方式包括:
-
'left'
: 左连接,保留左表的所有行。 -
'right'
: 右连接,保留右表的所有行。 -
'outer'
: 外连接,保留左右表的所有行。 -
'inner'
: 内连接,只保留左右表中匹配的行。
- on: 用于连接的列名。如果左右表都有这个列名,则直接使用该列进行连接。
- left_on: 左表中用作连接键的列名。
- right_on: 右表中用作连接键的列名。
- left_index: 如果为 True,则使用左表的索引作为连接键。
- right_index: 如果为 True,则使用右表的索引作为连接键。
- sort: 按连接键对合并后的数据进行排序,默认为 False。
- suffixes: 连接后的列名后缀,默认为
('_x', '_y')
。 - copy: 如果为 True,则总是复制数据,默认为 True。
- indicator: 如果为 True,则添加一个
_merge
列,指示每一行的来源。 - validate: 如果指定,可以用于检查合并是否符合预期。比如
'one_to_one'
,'one_to_many'
,'many_to_one'
,'many_to_many'
。
案例:
import pandas as pd
import numpy as np
# 示例数据
data = {
'age': [25, 30, 20, 35],
'name': ['小明', '小红', '小刚', '小美'],
'city': ['北京', '上海', '广州', '北京'],
'price': [2500, 4000, 1500, 3000],
'category': ['A-10', 'B-20', 'A-15', 'C-25']
}
# 创建DataFrame
df_inner = pd.DataFrame(data)
"""
age name city price category
0 25 小明 北京 2500 A-10
1 30 小红 上海 4000 B-20
2 20 小刚 广州 1500 A-15
3 35 小美 北京 3000 C-25
"""
# 将category字段按照-分割,创建新DataFrame split,列名为category和size。
split = pd.DataFrame(
[x.split('-') for x in df_inner['category']],
index=df_inner.index,
columns=['category', 'size']
)
print("\n分割后的DataFrame:")
print(split)
"""
分割后的DataFrame:
category size
0 A 10
1 B 20
2 A 15
3 C 25
"""
# 将分割后的DataFrame与原始DataFrame进行合并
df_inner = pd.merge(df_inner, split, left_index=True, right_index=True)
print("\n合并后的DataFrame:")
print(df_inner)
"""
合并后的DataFrame:
age name city price category_x category_y size
0 25 小明 北京 2500 A-10 A 10
1 30 小红 上海 4000 B-20 B 20
2 20 小刚 广州 1500 A-15 A 15
3 35 小美 北京 3000 C-25 C 25
"""
说明:
-
pd.merge(df_inner, split, left_index=True, right_index=True)
根据索引将分割后的DataFrame与原始DataFramedf_inner
进行合并。