Python 如何比较pandas中的单个字符串和多个字符串?

Python 如何比较pandas中的单个字符串和多个字符串?,python,pandas,Python,Pandas,这是我的样本数据 Doc1 Doc2 US1A US1U | US1F | US1G US1B US1O | US1T US1C US1A | US1O | US1N | US1P | US1M US1D US1B | US1O | US1N | US1P | US1M | US1E 我想使用Doc1将字符串与Doc2进行比较 如果在Doc2中找到Doc1列中的字符串,它会将Doc1中有字符串的行和比较的字符串添加到新数据框中 例如,在Doc1中,可以在

这是我的样本数据

Doc1     Doc2
US1A     US1U | US1F | US1G
US1B     US1O | US1T
US1C     US1A | US1O | US1N | US1P | US1M
US1D     US1B | US1O | US1N | US1P | US1M | US1E
我想使用Doc1将字符串与Doc2进行比较 如果在Doc2中找到Doc1列中的字符串,它会将Doc1中有字符串的行和比较的字符串添加到新数据框中

例如,在Doc1中,可以在Doc2的US1C行中找到US1A

new_df.append(df_doc1[j],df_doc1[i])
然后,它将添加到新的数据帧中,预期结果将是

new_Doc1  new_Doc2
US1A      US1C
US1B      US1D
参考预期结果,这里是我的代码

df_doc1 = df[['Doc1']]
df_doc2 = df[['Doc2']]

for i in range(1, len(df)):
    for j in range(1, len(df)):
        aa = df_doc1.isin(df_doc2)
        new_df = pd.DataFrame()
        if np.all(aa!=0):
            if bb==1:
                new_df.append(df_doc1[j],df_doc1[i])
            if bb>1:
                new_df.append(df_doc1[j])
                new_df.append(df_doc1[j])
        bb=bb+1

new_df

但问题是,当我打印新的_df时,我的代码没有返回任何内容,有什么建议吗?提前感谢您

您可以尝试使用
get_dummies
然后使用reindex和idxmax获取每组的max,如下所示:

m = df['Doc2'].str.get_dummies().set_index(df['Doc1'])
m.columns = m.columns.str.strip()
m.groupby(m.columns,axis=1).max().reindex(columns=m.index).idxmax().reset_index(name='Doc2')

试试这个

s = df.set_index('Doc1').Doc2.str.split(' \| ').explode()
new_df = s[s.isin(s.index)].reset_index().add_prefix('new_')

Out[28]:
  new_Doc1 new_Doc2
0     US1C     US1A
1     US1D     US1B
如果您希望列标签和顺序与预期的输出完全一致,您可以对其进行如下更改

new_df = (s[s.isin(s.index)].rename_axis('new_Doc2')
                            .reset_index(name='new_Doc1').sort_index(1))

Out[40]:
  new_Doc1 new_Doc2
0     US1A     US1C
1     US1B     US1D

虽然追加just do new_df=new_df.append(df_doc1[j],df_doc1[i]),谢谢你的评论,但我在新的数据框中仍然没有任何内容。u。谢谢你的建议,我理解拆分“|”,你能解释一下吗?此外,我还尝试解决属性explode()错误。你对这个问题有什么建议吗?@Sujin尝试将pandas版本更新为
0.25+
@Sujin:I在regex模式上拆分
'
,它是由3个字符组成的字符串
空格
空格
。在正则表达式中,
|
是表示替换的特殊字符(在正则表达式中表示
)。若要将特殊的
|
转回到文字
|
,需要在前面加上一个字符。在
explode
上,正如@anky_91所说,您应该更新到
pandas 0.25+
以使
explode
可用。感谢您的建议,结果中应该显示一些缺失的数据。例如,Doc1 Doc2 0 US1A US1C 1 US1B US1D 2 US1C NaN 3 US1D NaN 4 US1E US1A,但它只显示第一个数据。是因为idxmax()吗?@Sujin是的。对于多个匹配,您希望您的输出是什么样的,我想Andy的方法在这里更好
new_df = (s[s.isin(s.index)].rename_axis('new_Doc2')
                            .reset_index(name='new_Doc1').sort_index(1))

Out[40]:
  new_Doc1 new_Doc2
0     US1A     US1C
1     US1B     US1D