连接pandas中两个数据帧的行

use*_*126 53 python dataframe pandas

我需要连接两个数据帧df_a并且一个接一个地df_b使用相同数量的行(nRow)而不考虑任何键.这个功能类似于cbindR programming language.每个数据帧中的列数可能不同.

结果数据帧将具有相同的行nRow数和列数,等于两个数据帧中的列数之和.换句话说,这是两个数据帧的盲列式连接.

import pandas as pd
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'mz':[500.0, 500.5, 501.0]}
df_a = pd.DataFrame(dict_data)
dict_data = {'Treatment1': ['C', 'C', 'C'], 'Biorep1': ['A', 'A', 'A'], 'Techrep1': [1, 1, 1], 'AAseq1': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'inte1':[1100.0, 1050.0, 1010.0]}
df_b = pd.DataFrame(dict_data)
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 83

调用concat并传递param axis=1以逐列连接:

In [5]:

pd.concat([df_a,df_b], axis=1)
Out[5]:
        AAseq Biorep  Techrep Treatment     mz      AAseq1 Biorep1  Techrep1  \
0  ELVISLIVES      A        1         C  500.0  ELVISLIVES       A         1   
1  ELVISLIVES      A        1         C  500.5  ELVISLIVES       A         1   
2  ELVISLIVES      A        1         C  501.0  ELVISLIVES       A         1   

  Treatment1  inte1  
0          C   1100  
1          C   1050  
2          C   1010  
Run Code Online (Sandbox Code Playgroud)

有一个有用的指南,可以在线合并,加入和连接各种方法.

例如,由于没有冲突列,您可以merge使用索引,因为它们具有相同的行数:

In [6]:

df_a.merge(df_b, left_index=True, right_index=True)
Out[6]:
        AAseq Biorep  Techrep Treatment     mz      AAseq1 Biorep1  Techrep1  \
0  ELVISLIVES      A        1         C  500.0  ELVISLIVES       A         1   
1  ELVISLIVES      A        1         C  500.5  ELVISLIVES       A         1   
2  ELVISLIVES      A        1         C  501.0  ELVISLIVES       A         1   

  Treatment1  inte1  
0          C   1100  
1          C   1050  
2          C   1010  
Run Code Online (Sandbox Code Playgroud)

出于与上述相同的原因,一个简单的join工作原理:

In [7]:

df_a.join(df_b)
Out[7]:
        AAseq Biorep  Techrep Treatment     mz      AAseq1 Biorep1  Techrep1  \
0  ELVISLIVES      A        1         C  500.0  ELVISLIVES       A         1   
1  ELVISLIVES      A        1         C  500.5  ELVISLIVES       A         1   
2  ELVISLIVES      A        1         C  501.0  ELVISLIVES       A         1   

  Treatment1  inte1  
0          C   1100  
1          C   1050  
2          C   1010  
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么,在我的真实数据中,每个df中有1000行,`concat`给了我2000行,但`join`工作正常.在示例数据上,两者都可以正常工作 (3认同)
  • 实际上,您需要检查索引值是否匹配,否则您将得到更多的行,就像您观察到的那样,您可能需要在连接之前执行df_b = df_b.reindex_like(df_a) (3认同)
  • 检查是否有任何列名冲突,可以通过执行df_a.columns.equals(df_b.columns)进行测试。 (2认同)
  • @desmond我认为使用`concat`来解决`join`或`merge`的问题是它将迭代地增加df,并且在每次迭代时都会浪费,因为它将分配,复制和销毁先前的df (2认同)

Yur*_*let 6

感谢@EdChum,我一直在努力解决同样的问题,尤其是当索引不匹配时。不幸的是,在熊猫指南中,这种情况被遗漏了(例如,当您删除一些行时)

import pandas as pd
t=pd.DataFrame()
t['a']=[1,2,3,4]
t=t.loc[t['a']>1] #now index starts from 1

u=pd.DataFrame()
u['b']=[1,2,3] #index starts from 0

#option 1
#keep index of t
u.index = t.index 

#option 2
#index of t starts from 0
t.reset_index(drop=True, inplace=True)

#now concat will keep number of rows 
r=pd.concat([t,u], axis=1)
Run Code Online (Sandbox Code Playgroud)