使用键合并两个数据框,其中列成为行而另一个不成行

时间:2017-06-30 16:37:34

标签: python pandas dataframe

我有一个数据框df1,如下所示:

A   B   key
a1  b1  001A
a2  b2  4906
a3  b3  0190
a4  b4  1993

和另一个数据框df2如:

C   D   key
c1  1  001A
c1  2  4906
c1  3  0190
c1  4  1993
c2  5  001A
c2  6  4906
c2  7  0190
c2  8  1993

我想合并它们来获取

A   B   key    c1   c2 
a1  b1  001A    1    5
a2  b2  4906    2    6
a3  b3  0190    3    7
a4  b4  1993    4    8

我试过了

pd.merge(df, df2, on='key')

但它不像我想要的那样匹配。我似乎无法将行作为列。

1 个答案:

答案 0 :(得分:2)

您应首先pivot df2 df2.pivot(index='key', columns='C', values='D') 使其成为您想要的形状。

C     c1  c2
key         
001A   1   5
0190   3   7
1993   4   8
4906   2   6
df

然后,您可以将此数据透视表加入df.join(df2.pivot(index='key', columns='C', values='D'), on='key')

    A   B   key  c1  c2
0  a1  b1  001A   1   5
1  a2  b2  4906   2   6
2  a3  b3  0190   3   7
3  a4  b4  1993   4   8
pd.merge

或者,如果您愿意,可以使用pd.merge(df, df2.pivot(index='key', columns='C', values='D'), left_on='key', right_index=True) ,尽管它更详细。

def extract_kv_pairs(s):
    """Extract key value pairs seperated by colons and semi-colons."""
    kvp = []
    for r in s.split(';'):
        k, v = r.split(':')
        # is it an integer?
        try:
            # yes, convert it
            v = int(v)
        except ValueError:
            # no, trim the string
            v = v.strip()

        kvp.append((k.strip(), v))

    return kvp

s = 'Division : First; Grand Total: 3861; Grand Max Total: 4600'
kvp = extract_kv_pairs(s)
numeric_values = [p for p in kvp if isinstance(p[1], int)]
print(kvp)
# [('Division', 'First'), ('Grand Total', 3861), ('Grand Max Total', 4600)]
print(numeric_values)
# [('Grand Total', 3861), ('Grand Max Total', 4600)]