1

我可能使这个问题过于复杂,但是我似乎找不到一个简单的解决方案。

我有两个 DataFrame。我们称它们为 df1 和 df2。为了保持简单。假设 df1 有一列称为“某些数据”,而 df2 有两列称为“某些数据”和“其他数据”。

例子:

df1

Some Data "Lebron James 123" "Lebron James 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"

所以你可以看到The New?列将包括来自其他数据列的特定行的值。Lebron James 234 在 df2 的某些数据中并不存在,所以它说是新的。

我可以使用该方法让它说出 True 或 False .isin(),但是不知道如何获取其他 df 的索引并从其他数据列中获取值。

谢谢

编辑:

据我所知会起作用

df["New?"] = df1["Some Data"].isin(df2["some data"])

会渲染

df1[“新的?”]

True
False

所以我希望 True 成为“我希望 df1[“New?”] 中的这个,而 False 成为新的

4

2 回答 2

1

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
于 2018-09-07T17:52:30.783 回答
1

根据您的信息,您似乎只需要一个简单的np.where(如果dfs长度相同)

df1['New?'] = np.where(df1["Some Data"].isin(df2["some data"]), df2['other data'], 'New')

    Some Data                       New?
0   Lebron James 123 + other text   I want this in df1[New?"]"
1   Lebron James 234                New

对于不同的长度,

mask = df2["some data"].isin(df["Some Data"]).values
df.loc[mask,'New'] = df2.loc[mask, 'other data']

df.fillna('New')

解释

基本上你有一个掩码,并且你使用相同的掩码来过滤两个数据帧。这会在给定描述的情况下产生相同数量的结果dfs,并且您将过滤行的“其他数据”值分配给“某些数据”df2中的相同匹配行df

于 2018-09-07T17:54:40.777 回答