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填充。根据你的具体需求选择合适的合并方式。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐