熊猫数据框按列名称按功能合并

时间:2018-06-20 06:23:48

标签: python-3.x pandas dataframe merge concat

我对数据框说。

df_A具有A__a,B__b,C列(形状为5,3)

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

我如何才能统一它们(而不必遍历所有列)以获得带有A,B列的df? (形状9,2)-表示A__a和A_a应该统一到同一列。

我需要结合使用合并功能lambda x: x.replace("_","")。有可能吗?

4 个答案:

答案 0 :(得分:0)

一个简单的串联即可

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

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

答案 1 :(得分:0)

如果您无法提前更改列的名称,并且想使用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)

答案 2 :(得分:0)

您必须使用“外部”合并数据框

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)

答案 3 :(得分:0)

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