我可能使这个问题变得过于复杂,但是我似乎找不到一个简单的解决方案。
我有两个 DataFrame。我们将它们称为 df1 和 df2。为了让事情变得简单。假设 df1 有一个名为“某些数据”的列,df2 有两列称为“某些数据”和“其他数据”。
示例:
df1
一些数据
“勒布朗·詹姆斯 123”
“勒布朗·詹姆斯 234”
df2
some data other data
"Lebron James 123 + other text" "I want this in df1["New?"]"
"Michael Jordan" "Doesn't Matter"
所以基本上我想在 df1 中创建一个名为“New?”的新列。如果 df1["Some data"] 位于 df2["Some other data"] 中,这个新列(在 df1 中)将显示“New”。但是,如果 df2["some data"] 中没有实例,则我将 df1["New?"] 设置为 df2["other data"] 中该特定行的值。
运行后期望的结果:
df1
Some Data New?
"Lebron James 123" "I want this in df1["New?"]"
"Lebron James 234" "New"
正如您所看到的那样?列将包含其他数据列中该特定行的值。 Lebron James 234 不在 df2 的某些数据中,因此显示为新。
我可以使用 .isin()
方法让它说出 True 或 False,但是不知道如何获取另一个 df 的索引并从另一个 df 获取值数据栏。
谢谢
编辑:
据我所知会起作用
df["New?"] = df1["Some Data"].isin(df2["some data"])
会渲染
df1["新的?"]
True
False
所以我希望 True 成为“我希望这个在 df1["New?"]”中,而 False 成为 New
最佳答案
首先通过加入 df1
系列创建正则表达式:
rgx = '|'.join(df1['some data'])
现在使用np.where
:
df1.assign(data=np.where(df2['some data'].str.match(rgx), df2['other data'], 'New'))
some data data
0 Lebron James 123 I want this in df1["New?"]
1 Lebron James 234 New
形状不匹配的示例:
df1 = pd.DataFrame({'a': ['a', 'b', 'c', 'd']})
df2 = pd.DataFrame({'a': ['aaaaa', 'bbbb', 'ffff', 'gggg', 'hhhh']})
rgx = '({})'.format('|'.join(df1.a))
m = df2.assign(flag=df2.a.str.extract(rgx))
df1.set_index('a').join(m.set_index('flag')).fillna('New').reset_index()
index a
0 a aaaaa
1 b bbbb
2 c New
3 d New
关于python - 如果一个数据帧的行值位于另一个数据帧的列中,则创建一个新列并获取该索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52227248/