如果一個列字符串包含在另一個列字符串中,則使用Python一對多合并兩個數據幀

如果來自df1words列的值包含來自df2keywords列的值,我有兩個數據幀要合并。我一直在嘗試使用str.extract。但到目前為止,沒有運氣達到預期的結果。示例如下:

df1:

[{'id': 1, 'words': 'chellomedia', 'languages': nan},
 {'id': 2, 'words': 'Moien Welt!', 'languages': 'Luxemburgish'},
 {'id': 3, 'words': 'Ahoj světe!', 'languages': 'Czech'},
 {'id': 4, 'words': 'hello world', 'languages': nan},
 {'id': 5, 'words': '?Hola Mundo!', 'languages': 'Spanish'},
 {'id': 6, 'words': 'hello kitty', 'languages': 'English'},
 {'id': 7, 'words': 'Ciao mondo!', 'languages': 'Italian'},
 {'id': 8, 'words': 'hola world', 'languages': nan}]

df2:

[{'code': 1, 'keywords': 'Hello'},
 {'code': 2, 'keywords': 'hola'},
 {'code': 3, 'keywords': 'world'}]

我的試用代碼:

df1['words'] = df1['words'].str.lower()
df2['keywords'] = df2['keywords'].str.lower()

pat = '|'.join([re.escape(x) for x in df2.keywords])
df1.insert(0, 'keywords', df1['words'].str.extract('(' + pat + ')', expand=False))

pd.merge(df1, df2, on='keywords', how='left')

Out:

  keywords  id         words     languages  code
0    hello   1   chellomedia           NaN   1.0
1      NaN   2   moien welt!  Luxemburgish   NaN
2      NaN   3   ahoj světe!         Czech   NaN
3    hello   4   hello world           NaN   1.0
4     hola   5  ?hola mundo!       Spanish   2.0
5    hello   6   hello kitty       English   1.0
6      NaN   7   ciao mondo!       Italian   NaN
7     hola   8    hola world           NaN   2.0

但是想要的應該是這樣的:

  keywords  id         words     languages  code
0    hello   1   chellomedia           NaN   1.0
1      NaN   2   moien welt!  Luxemburgish   NaN
2      NaN   3   ahoj světe!         Czech   NaN
3    hello   4   hello world           NaN   1.0
4    world   4   hello world           NaN   3.0  ---> should be generated in df
5     hola   5  ?hola mundo!       Spanish   2.0
6    hello   6   hello kitty       English   1.0
7      NaN   7   ciao mondo!       Italian   NaN
8     hola   8    hola world           NaN   2.0
9    world   8    hola world           NaN   3.0  ---> should be generated in df

我如何才能產生預期的結果?謝謝。

? 最佳回答:

您必須使用findallexplode來代替extract,例如:

df1.insert(0, 'keywords', df1['words'].str.findall('(' + pat + ')'))
print(pd.merge(df1.explode('keywords'), df2, on='keywords', how='left')
        .sort_values('id').reset_index(drop=True))

Output:

  keywords  id         words     languages  code
0    hello   1   chellomedia           NaN   1.0
1      NaN   2   moien welt!  Luxemburgish   NaN
2      NaN   3   ahoj světe!         Czech   NaN
3    hello   4   hello world           NaN   1.0
4    world   4   hello world           NaN   3.0
5     hola   5  ?hola mundo!       Spanish   2.0
6    hello   6   hello kitty       English   1.0
7      NaN   7   ciao mondo!       Italian   NaN
8    world   8    hola world           NaN   3.0
9     hola   8    hola world           NaN   2.0

與您需要的完全相同:)

主站蜘蛛池模板: 国产一区二区四区在线观看| 国产精品一区电影| 精品三级AV无码一区| 波多野结衣一区二区三区高清在线| 亚洲熟妇av一区二区三区| 无码AV一区二区三区无码| 久久精品国产AV一区二区三区| A国产一区二区免费入口| 日本夜爽爽一区二区三区| 日韩精品一区二区三区老鸭窝 | 国产一区二区在线观看| 精品无码一区二区三区电影| 国产乱码精品一区二区三| 欧美日韩一区二区成人午夜电影 | 中文精品一区二区三区四区| 亚洲日韩精品无码一区二区三区| 一区二区国产在线观看| 国产嫖妓一区二区三区无码| 国产精品一区二区香蕉| 日本v片免费一区二区三区| 亚洲愉拍一区二区三区| 国模极品一区二区三区| 精品国产一区二区三区免费看| 毛片一区二区三区无码| 无码国产精品一区二区免费I6| 99国产精品欧美一区二区三区 | 爆乳熟妇一区二区三区霸乳| 一区二区三区在线|日本| 亚洲福利精品一区二区三区| 亚洲av午夜精品一区二区三区| 成人区人妻精品一区二区不卡网站| 一区二区三区亚洲视频| 亚洲一区二区三区在线观看精品中文 | 亚洲一区二区三区香蕉| 亚洲一区中文字幕久久| 一区二区视频在线播放| 亚洲av成人一区二区三区观看在线| 亚洲日韩一区精品射精| 国产福利一区视频| 99久久精品国产免看国产一区 | 亚洲国产一区国产亚洲 |