如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?

问题描述 投票:0回答:5

我有两个df看起来像这样:

df1:

id
1
2


df2:

id    value
2       a
3       b

如何匹配这两个数据框并仅在新列中返回value列中的数据?

new_merged_df

id   value   new_value
1
2     a         a
3     b
python-3.x pandas dataframe merge
5个回答
2
投票

您可以使用@JJFord3设置尝试此操作:

import pandas

df1 = pandas.DataFrame(index=[1,2])
df2 = pandas.DataFrame({'value' : ['a','b']},index=[2,3])

#Use isin to create new_value   
df2['new_value'] = df2['value'].where(df2.index.isin(df1.index))
#Use reindex with union to rebuild dataframe with both indexes
df2.reindex(df1.index.union(df2.index))

输出:

  value new_value
1   NaN       NaN
2     a         a
3     b       NaN

1
投票
import pandas

df1 = pandas.DataFrame(index=[1,2])
df2 = pandas.DataFrame({'value' : ['a','b']},index=[2,3])

new_merged_df_outer = df1.merge(df2,how='outer',left_index=True,right_index=True)
new_merged_df_inner = df1.merge(df2,how='inner',left_index=True,right_index=True)
new_merged_df_inner.rename(columns={'value':'new_value'})
new_merged_df = new_merged_df_outer.merge(new_merged_df_inner,how='left',left_index=True,right_index=True)

首先,创建外部合并以保留所有索引。然后创建内部合并以仅获得重叠。然后将内部合并合并回外部合并以获得所需的列设置。


0
投票

你可以使用full outer join

让我们使用案例类为您的数据建模:

case class MyClass1(id: String)
case class MyClass2(id: String, value: String)

//  this one for the result type
case class MyClass3(id: String, value: Option[String] = None, value2: Option[String] = None)

创建一些输入:

val input1: Dataset[MyClass1] = ...
val input2: Dataset[MyClass2] = ...

加入您的数据:

import scala.implicits._
val joined = input1.as("1").joinWith(input2.as("2"), $"1.id" === $"2.id", "full_outer")

joined map {
  case (left, null) if left != null => MyClass3(left.id)
  case (null, right) if right != null => MyClass3(right.id, Some(right.value))
  case (left, right) => MyClass3(left.id, Some(right.value), Some(right.value))
}

0
投票

DataFrame.merge在参数indicator中有

如果为True,则添加一列以输出名为“_merge”的DataFrame,其中包含每行源的信息。

这可用于检查是否匹配

import pandas as pd

df1 = pd.DataFrame(index=[1,2])
df2 = pd.DataFrame({'value' : ['a','b']},index=[2,3])

# creates a new column `_merge` with values `right_only`, `left_only` or `both`
merged = df1.merge(df2, how='outer', right_index=True, left_index=True, indicator=True) 
merged['new_value'] = merged.loc[(merged['_merge'] == 'both'), 'value']
merged = merged.drop('_merge', axis=1)

0
投票

使用mergeisin

df = df1.merge(df2,on='id',how='outer')

id_value = df2.loc[df2['id'].isin(df1.id.tolist()),'id'].unique()
mask = df['id'].isin(id_value)
df.loc[mask,'new_value'] = df.loc[mask,'value']
# alternative df['new_value'] = np.where(mask, df['value'], np.nan)    

print(df)
   id value new_value
0   1   NaN       NaN
1   2     a         a
2   3     b       NaN
© www.soinside.com 2019 - 2024. All rights reserved.