这是我的示例数据
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时我的代码什么也不返回,有什么建议吗?并先谢谢您
答案 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