2016-04-26 82 views
1

我有这样合并多于2蟒大熊猫数据帧

num a -- num b -- num c -- num d 
101 0  101 1  102 0   101 1 
102 1  103 1  103 0   102 0 
103 0  104 0  104 1   103 1 
104 0  105 0  105 1   104 1 
105 1  107 1  106 1   106 0 
106 1  108 1  107 1   107 0 

我有他们在一个数组称为帧的一些数据帧。 我要像做pd.concat(帧),并有结果

num a b c d 
101 0 1 Nan 1 
102 1 Nan 0 0 
103 0 1 0 1 
104 0 0 1 1 
105 1 0 1 Nan 
106 1 Nan 1 0 
107 Nan 1 1 0 
108 Nan 1 Nan Nan 

,但我想我应该用pd.merge设置NUM作为联接的列。使用合并我想我只能合并2个数据帧,我应该在循环中使用它来合并我所有的数据帧吗?或者我可以用concat来做到这一点,还是有另一种(和更好的)方法?

+0

我不知道更好的办法,'concat'只会如果索引设置为'num'手之前,否则这将携手).merge(df3,how ='outer')。merge(df4,how ='outer')'但它有点儿满口 – EdChum

回答

1

UPDATE:

dfs = [] 

data = """\ 
num a 
101 0 
102 1 
103 0 
104 0 
105 1 
106 1 
""" 
dfs.append(pd.read_csv(io.StringIO(data), delim_whitespace=True)) 

data = """\ 
num b 
101 1 
103 1 
104 0 
105 0 
107 1 
108 1 
""" 
dfs.append(pd.read_csv(io.StringIO(data), delim_whitespace=True)) 

data = """\ 
num c 
102 0 
103 0 
104 1 
105 1 
106 1 
107 1 
""" 
dfs.append(pd.read_csv(io.StringIO(data), delim_whitespace=True)) 

data = """\ 
num d 
101 1 
102 0 
103 1 
104 1 
106 0 
107 0 
""" 
dfs.append(pd.read_csv(io.StringIO(data), delim_whitespace=True)) 

让我们设置num为指数:

for i in range(len(dfs)): 
    dfs[i].set_index('num', inplace=True) 


df = pd.concat(dfs, axis=1) 

产量:

In [116]: df 
Out[116]: 
     a b c d 
num 
101 0.0 1.0 NaN 1.0 
102 1.0 NaN 0.0 0.0 
103 0.0 1.0 0.0 1.0 
104 0.0 0.0 1.0 1.0 
105 1.0 0.0 1.0 NaN 
106 1.0 NaN 1.0 0.0 
107 NaN 1.0 1.0 0.0 
108 NaN 1.0 NaN NaN 

OLD答案:

尝试pd.concat(...,轴= 1):

pd.concat(frames, axis=1) 

它会通过指数水平串连您的框架,所以你可能要设置合适的索引事先

+0

set_index是我需要的 –

1

除了pd.concat,您还可以使用pd.merge

import pandas as pd 
import io 
a = pd.read_csv(
    io.StringIO(
     "num,a\n101,0\n102,1\n103,0\n104,0\n105,1\n106,1\n" 
    ), 
    header = 0 
) 

b = pd.read_csv(
    io.StringIO(
     "num,b\n101,1\n103,1\n104,0\n105,0\n107,1\n108,1\n" 
    ), 
    header = 0 
) 

c = pd.read_csv(
    io.StringIO(
     "num,c\n102,0\n103,0\n104,1\n105,1\n106,1\n107,1\n" 
    ), 
    header = 0 
) 

d = pd.read_csv(
    io.StringIO(
     "num,d\n101,1\n102,0\n103,1\n104,1\n106,0\n107,0\n" 
    ), 
    header = 0 
) 

mylist = [a, b, c, d] 

for i in range(4): 
    if i == 0: 
     result = mylist[i] 
    else: 
     result = pd.merge(
      result, 
      mylist[i], 
      how = 'outer', 
      on = 'num' 
     ) 

然后你会得到结果。 `df1.merge(DF2,如何=“外”:

In [14]: result 
Out[14]: 

    num a b c d 
0 101 0.0 1.0 NaN 1.0 
1 102 1.0 NaN 0.0 0.0 
2 103 0.0 1.0 0.0 1.0 
3 104 0.0 0.0 1.0 1.0 
4 105 1.0 0.0 1.0 NaN 
5 106 1.0 NaN 1.0 0.0 
6 107 NaN 1.0 1.0 0.0 
7 108 NaN 1.0 NaN NaN