如何在熊猫中比较单个字符串和多个字符串?

时间:2020-01-13 03:36:09

标签: 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中,US1A位于Doc2的US1C行中。

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

但是问题是我打印new_df时我的代码什么也不返回,有什么建议吗?并先谢谢您

2 个答案:

答案 0 :(得分:3)

您可以尝试使用get_dummies,然后使用reindex和idxmax来获得每个组的最大值,如下所示:

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')

   Doc1  Doc2
0  US1A  US1C
1  US1B  US1D
2  US1C   NaN
3  US1D   NaN

答案 1 :(得分:2)

尝试一下

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