【问题标题】:Merge of more than 2 python pandas data frames合并2个以上的python pandas数据框
【发布时间】:2016-08-20 22:24:56
【问题描述】:

我有一些这样的数据框

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(frames) 的事情并因此得到

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.mergenum 设置为加入列。使用 merge 我想我只能合并 2 个数据框,我应该在循环中使用它来合并我所有的数据框吗?或者我可以用 concat 做到这一点还是有另一种(更好的)方法?

【问题讨论】:

  • 我不确定更好的方法,concat 仅在索引设置为 num 时才有效,否则这将有效:df1.merge(df2, how='outer').merge(df3, how='outer').merge(df4, how='outer') 但它有点拗口

标签: python pandas dataframe merge concat


【解决方案1】:

更新:

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

旧答案:

试试 pd.concat(..., axis=1):

pd.concat(frames, axis=1)

它会通过 index 水平连接您的帧,因此您可能需要事先设置适当的索引

【讨论】:

  • set_index 是我需要的
【解决方案2】:

除了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'
        )

然后你就会得到结果。

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

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2021-08-23
    • 1970-01-01
    • 2015-10-14
    • 2021-06-25
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多