我有两个这样的DataFrame:
df1 =
sent token token2
0 a b
0 a c
0 b d
1 g h
1 h k
1 h i
1 g i
1 g k
df2 =
sent token token2 rel
0 a b A
1 g h B
1 k g C
现在我想将这两个DataFrame合并为一个看起来像这样:
df_new =
sent token token2 rel
0 a b A
0 a c NaN
0 b d NaN
1 g h B
1 h k NaN
1 h i NaN
1 g i NaN
1 g k C
然而合并像这样的DataFrame
df_new = df1.merge(df2, on=["sent","token","token2"], how="left")
除了["rel"]
令牌错误
df_new =
sent token token2 rel
0 a b A
0 a c NaN
0 b d NaN
1 g h B
1 h k NaN
1 h i NaN
1 g i NaN
1 g k NaN
这是由于df1
中令牌的顺序。由于["rel"]
中的值取决于["token1"] -> ["token2"]
,因此当订单撤消时,它无法应用其值。有没有办法在合并过程中执行此操作而不创建新版本的df1
?
答案 0 :(得分:2)
您可以使用np.sort
df2[['token','token2']]=np.sort(df2[['token','token2']].values,axis = 1)
df1.merge(df2, on=["sent","token","token2"], how="left")
Out[398]:
sent token token2 rel
0 0 a b A
1 0 a c NaN
2 0 b d NaN
3 1 g h B
4 1 h k NaN
5 1 h i NaN
6 1 g i NaN
7 1 g k C
答案 1 :(得分:1)
解决方案:
我必须在第一个DataFrame中包含token
和token2
的所有可能组合,因为rel
的结果取决于这两个值的正确顺序。这意味着我期望的结果在开始时是错误的。
我必须在创建df1
:
df1[['token','token2']]=np.sort(df1[['token','token2']],1)
所以我为这个任务得到了所需的df1版本。
df1 =
sent token token2
0 a b
0 a c
0 a d
0 b a
0 b c
0 b d
...