Pandas 数据框按列名函数合并

Pandas dataframe merge by function on column names

我对数据框说。

df_A 有列 A__a、B__b、C。(形状 5,3)

df_B 有列 A_a、B_b、D。(形状 4,3)

如何统一它们(无需遍历所有列)以获得一个包含 A、B 列的 df? (shape 9,2) - 意思是 A__a 和 A_a 应该统一到同一列。

我需要在应用函数 lambda x: x.replace("_","") 时使用合并。可能吗?

一个简单的串联即可

pd.concat([df_A, df_B], join='outer')[['A', 'B']].copy().

或 'pd.concat([df_A, df_B], join='inner')

如果你不能提前更改列的名称而想使用lambda x: x.replace("_",""),这是一个方法:

df = pd.concat([df1.rename_axis(lambda x: str(x).replace("_",""),axis='columns'), df2.rename_axis(lambda x: str(x).replace("_",""),axis='columns')], join='inner', ignore_index=True)

示例:

d1 = {'A__a' : ('A', 'B', 'C', 'D', 'E') ,  'B__b' : ('a', 'b', 'c', 'd', 'e') ,'C': (1,2,3,4,5)}
df1 = pd.DataFrame(d1)
  A__a B__b  C
0    A    a  1
1    B    b  2
2    C    c  3
3    D    d  4
4    E    e  5

d2 = {'A_a' : ('B', 'C', 'D','G') , 'B_b' : ('l','m','n','o') ,'D': (6,7,8,9)}
df2=pd.DataFrame(d2)
  A_a B_b   D
0   B   l   6
1   C   m   7
2   D   n   8
3   G   o   9

输出:

   Aa Bb
0  A  a
1  B  b
2  C  c
3  D  d
4  E  e
5  B  l
6  C  m
7  D  n
8  G  o

选择:

df = pd.concat([df1.rename(columns={'A__a':'A', 'B__b':'B'}), df2.rename(columns={'A_a':'A', 'B_b':'B'})], join='inner', ignore_index=True)

您必须使用 'outer'

合并 Dataframe
import pandas as pd
import numpy as np


df_A = pd.DataFrame(np.random.randint(10,size=(5,3)), columns=['A','B','C'])
df_B = pd.DataFrame(np.random.randint(10,size=(4,3)), columns=['A','B','D'])

print(df_A.shape,df_B.shape)
#(5, 3) (4, 3)
new_df = df_A.merge(df_B , how= 'outer', on = ['A','B'])[['A','B']]
print(new_df.shape)
#(9,2)
import pandas as pd
df = pd.DataFrame(np.random.randint(0,5,size=(5, 3)), columns=['A__a', 'B__b', 'C'])

df:

   A__a  B__b  C
0     3     0  2
1     0     3  4
2     0     4  4
3     4     2  1
4     3     4  3

df2:

df2 = pd.DataFrame(np.random.randint(0,4,size=(4, 3)), columns=['A__a', 'B__b', 'D'])

   A__a  B__b  D
0     3     2  0
1     3     1  1
2     0     2  0
3     3     2  0

df3 = pd.concat([df, df2], join='inner', ignore_index=True)
df_final = df3.rename(lambda x: str(x).split("__")[0],axis='columns')
df_final

df_final:

    A   B
0   3   0
1   0   3
2   0   4
3   4   2
4   3   4
5   3   2
6   3   1
7   0   2
8   3   2