这是我想要做的一个例子:
In [46]: import pandas as pd
In [47]: df_3 = pd.DataFrame(np.arange(12).reshape(6,2), columns=["a", "z"])
In [48]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=["a", "b", "c"])
In [49]: df
Out[49]:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
[4 rows x 3 columns]
In [50]: df_3
Out[50]:
a z
0 0 1 # present in df
1 2 3
2 4 5
3 6 7 # present in df
4 8 9
5 10 11
[6 rows x 2 columns]
我想将列z添加到df
,但我希望仅为列a
上匹配的行添加值。如果不是,我想要一个空值。
我想要的输出如下:
In [52]: df["z"] = [1, np.nan, 7, np.nan]
In [53]: df
Out[53]:
a b c z
0 0 1 2 1
1 3 4 5 NaN
2 6 7 8 7
3 9 10 11 NaN
[4 rows x 4 columns]
我试过天真的尝试,比如
In [57]: df.merge(df_3, on=["a"])
Out[57]:
a b c z
0 0 1 2 1
1 6 7 8 7
[2 rows x 4 columns]
哪个不能给我我想要的结果。
答案 0 :(得分:2)
只需在'a'列上执行merge
并执行左类型合并:
In [72]:
df.merge(df_3, on='a', how='left')
Out[72]:
a b c z
0 0 1 2 1
1 3 4 5 NaN
2 6 7 8 7
3 9 10 11 NaN
你得到这个结果的原因是:
In [57]: df.merge(df_3, on=["a"])
Out[57]:
a b c z
0 0 1 2 1
1 6 7 8 7
[2 rows x 4 columns]
是因为合并的默认类型是'inner',因此值必须同时存在于lhs和rhs中,请参阅文档:http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging