2016-04-26 128 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