我有一个数据框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')
但它不像我想要的那样匹配。我似乎无法将行作为列。
答案 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)]