Pandas通过两列连接DataFrames

时间:2018-06-16 15:41:47

标签: python pandas dataframe merge

你可以帮我加入两个DataFrame。

我有两个DataFrame。

DF1:

index   val1    val2
--------------------
1       str1    abc1
2       str2    abc2
3       str3    abc3
4       str4    abc9
5       str5    abc4

DF2:

index   val2
------------
1       abc1
2       abc2
4       abc3 
5       abc4
9       abc5

我需要基于前两个创建一个DataFrame,左边连接两列。列索引和val2在两个DataFrame中具有相同的名称。 df3的结果应如下所示:

index   val1    val2    val3
----------------------------
1       str1    abc1    1
2       str2    abc2    1
3       str3    abc3    NaN
4       str4    abc9    NaN
5       str5    abc4    1

如果df1中的索引与df2中的val2相同,则应删除df2中不存在的df1索引,然后将1添加到新列val3中,否则:NaN。

提前非常感谢!

3 个答案:

答案 0 :(得分:4)

这是一种方式。如下所示,我建议您使用布尔而不是float作为val3,就像系列所代表的那样。

# merge and set index
res = df1.merge(df2, how='left').set_index('index')

# map val2 from df2
res['val3'] = df2.set_index('index')['val2']

# check for equality of val3 and val2
res['val3'] = res['val3'] == res['val2']

print(res)

       val1  val2   val3
index                   
1      str1  abc1   True
2      str2  abc2   True
3      str3  abc3  False
4      str4  abc9  False
5      str5  abc4   True

答案 1 :(得分:2)

您可以尝试将import android.support.design.widget.CoordinatorLayout; 默认为)与join一起使用,以便df2的列名重命名为后缀。然后,使用rsuffix检查列值是否匹配,并为np.where列分配值。

val3

结果:

import numpy as np

df = df1.join(df2, rsuffix='_df2')
df['val3'] = np.where(df.val2 == df.val2_df2, 1, np.NaN)
del df['val2_df2']
print(df)

答案 2 :(得分:1)

由于您希望合并索引和列的组合,您可以将它们全部添加到索引,或者在合并之前添加[program:site] command=bash -c "/home/some/virtual/env/dir/run/start.sh" user=some stdout_logfile=/home/some/etc/supervisor/logs/logging.log redirect_stderr=true environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,HOME="/home/some",USER="some" stopsignal=KILL killasgroup=true autostart=true 。我们还会将reset_index列分配给df2,以便将其合并。

val3

输出:

(df1.reset_index().merge(
     df2.reset_index().assign(val3 = 1), on=['index', 'val2'], how='left')
    .set_index('index'))

如果 val1 val2 val3 index 1 str1 abc1 1.0 2 str2 abc2 1.0 3 str3 abc3 NaN 4 str4 abc9 NaN 5 str5 abc4 1.0 只是一列而不是索引,那么就像指定要合并的两个键一样简单。

'index'

输出:

df1.merge(df2.assign(val3 = 1), on=['index', 'val2'], how='left')
相关问题