python按索引合并两个(或多个)DataFrame
python按索引合并两个DataFrame
1. merge
2.1 merge
当合并两个 DataFrames 的索引时,
merge() 函数
的 left_index 和 right_index 参数的值应该是 True。下面的代码示例将合并两个 DataFrames,加入类型为 inner。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(['a','b','d','e','h'],index = [1,2,4,5,7], columns = ['C1'])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])
df_inner = df1.merge(df2, how='inner', left_index=True, right_index=True)
print(df_inner)
输出
C1 C2
1 a AA
2 b BB
5 e EE
另
df1 = pd.DataFrame({'C0':['a','b','d','e','h'], 'C1': ['a2','b2','d2','e2','h2']},index = [1,2,4,5,7])
df2 = pd.DataFrame(['AA','BB','CC','EE','FF'],index = [1,2,3,5,6], columns = ['C2'])
df_inner = df1[['C1']].merge(df2, how='inner', left_index=True, right_index=True)
print(df_inner)
输出
C1 C2
1 a2 AA
2 b2 BB
5 e2 EE
2.2 merge 介绍
pandas的merge函数可以通过指定多个条件来进行合并操作。可以使用列表或元组来指定多个列作为合并的条件,例如:
merged_df = pd.merge(df1, df2, on=['col1', 'col2'])
这将使用df1和df2中的’col1’和’col2’列作为合并的条件。如果需要指定不同的列名,则可以使用left_on和right_on参数来指定左右两个数据框中的列名,例如:
merged_df = pd.merge(df1, df2, left_on=['col1', 'col2'], right_on=['col3', 'col4'])
这将使用df1中的’col1’和’col2’列和df2中的’col3’和’col4’列作为合并的条件。
另一种方案是使用pd.merge函数,并传入left_on和right_on参数来指定不同Dataframe中所需匹配的列。以df1和df2有col1和col2两列需匹配为例,代码如下:
pd.merge(df1, df2, left_on=['col1', 'col2'], right_on=['col1', 'col2'])
当然,也可以使用这种方式对多列进行合并:
pd.merge(df1, df2, left_on=['col1', 'col2', 'col3'], right_on=['col1', 'col2', 'col4'])
同时,也可以通过传入一个字典作为on参数来合并多个条件,示例代码如下:
import pandas as pd
# 创建两个DataFrame
df1 = pd.DataFrame({
'key1': ['A', 'B', 'C', 'D'],
'key2': ['X', 'Y', 'Z', 'X'],
'value': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
'key3': ['B', 'D', 'E'],
'key4': ['Y', 'X', 'W'],
'value': [5, 6, 7]
})
# 定义用于合并的字典
merge_on = {
'key1': 'key3',
'key2': 'key4'
}
# 将df1和df2按照merge_on字典中定义的条件进行合并
result = pd.merge(df1, df2, left_on=list(merge_on.keys()), right_on=list(merge_on.values()))
print(result)
以上代码将df1和df2按照merge_on字典中定义的key1和key2列进行合并,得到的结果如下:
key1 key2 value_x key3 key4 value_y
0 B Y 2 B Y 5
1 D X 4 D X 6
2.3 删除列
要么 rename 要在 merge 之前匹配的列统一列名并仅指定 on :
result = pd.merge(
df1,
df2[['isin', 'issue_date']].rename(columns={'isin': 'isin_code'}),
on='isin_code',
how='left'
)
或 drop 合并后的重复列:
result = pd.merge(
df1,
df2[['isin', 'issue_date']],
how='left',
left_on='isin_code',
right_on='isin'
).drop(columns='isin')
2.4 保留索引
2. 拼接多个dataframe
# data_files 文件列表
df = (pd.read_table(f, sep=',', encoding='utf-8', error_bad_lines=False, skiprows=[0, 2, 3]) for f in tqdm(data_files))
dat_df = pd.concat(df)
# 上面两行可以合并
df = pd.concat(pd.read_table(f, sep=',', encoding='utf-8', error_bad_lines=False, skiprows=[0,2,3]) for f in tqdm(data_files))
- error_bad_lines=False # 跳过出错的行,超出header字段的行(默认情况下,字段过多的行(例如,逗号过多的 csv 行)会引发异常,并且不会返回任何 DataFrame。 如果为 False,那么这些“坏行”将从返回的 DataFrame 中删除,然后返回正常的这部分数据。)
3. reduce横向快速拼接
确实有一种更高效的方法来合并多个DataFrame,那就是使用reduce
函数结合merge
。这样你可以用一行代码实现多个DataFrame的合并。首先,你需要从functools
模块导入reduce
函数。
下面是如何用一行代码实现你的需求:
from functools import reduce
import pandas as pd
# 假设df4, df5, df6, df7, df8, df9是已经定义好的DataFrame列表
dataframes = [df4, df5, df6, df7, df8, df9]
# 使用reduce和merge来合并所有DataFrame
merged_df = reduce(lambda left, right: pd.merge(left, right, on='time', how='inner'), dataframes)
在这个例子中,reduce
函数会依次应用merge
操作到列表中的每个DataFrame。使用lambda
函数定义了如何合并两个DataFrame:通过’time’列以’inner’方式合并。这样,你可以避免编写多行重复的merge
调用。
如果你希望保留所有DataFrame中的所有’time’值,即使某些DataFrame中没有对应的行,可以将how='inner'
改为how='outer'
:
merged_df = reduce(lambda left, right: pd.merge(left, right, on='time', how='outer'), dataframes)
这种方式将在合并过程中包含所有唯一的’time’值,缺失的数据将以NaN填充。根据你的具体需求选择合适的合并方式。
更多推荐
所有评论(0)