如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?相关的知识,希望对你有一定的参考价值。
我有两个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
答案
您可以使用@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
另一答案
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)
首先,创建外部合并以保留所有索引。然后创建内部合并以仅获得重叠。然后将内部合并合并回外部合并以获得所需的列设置。
另一答案
你可以使用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))
}
另一答案
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)
另一答案
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
以上是关于如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?的主要内容,如果未能解决你的问题,请参考以下文章