第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于列值作為子集的匹配數(shù)據(jù)幀

基于列值作為子集的匹配數(shù)據(jù)幀

呼喚遠方 2022-08-25 15:53:17
假設(shè)我有兩個熊貓數(shù)據(jù)幀:import pandas as pdsource_df = pd.DataFrame.from_dict({"Total": [315.59, 241.17, 165.87],                                              "Label": ["id|1234", "id|2345", "id|2333"]})    Total    Label0  315.59  id|12341  241.17  id|23452  165.87  id|2333和match_df = pd.DataFrame.from_dict(    {"Labels": ["id|1234; id|4957", "id|7632", "id|2345; id|9342", "id|2333; id|8321; id|9001"]})                      Labels0           id|1234; id|49571                    id|76322           id|2345; id|93423  id|2333; id|8321; id|9001我想替換使用 中的值中的值,選擇 位于 中的行。因此,所需的輸出將是:Labelsource_dfLabelsmatch_dfsource_df.Labelmatch_df.Labels    Total                      Label0  315.59           id|1234; id|49571  241.17           id|2345; id|93422  165.87  id|2333; id|8321; id|9001我目前這樣做的方法依賴于 DataFrames using 之間的成對比較,這是出了名的慢,需要避免:iterrowsfor ii, row in source_df.iterrows():                                                for _, match_row in match_df.iterrows():                                            if row.Label in match_row.Labels:                                                   source_df.at[ii, "Label"] = match_row.Labels                                    break有沒有一種更pythonic和更有效的方法來實現(xiàn)這種行為?
查看完整描述

1 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

首先使用DataFrame.explode(pandas 0.25 +)由Series.str.split創(chuàng)建的列表,因此可以使用DataFrame.mergeLabels


df1 = match_df.assign(Label = match_df['Labels'].str.split('; ')).explode('Label')


df = source_df.merge(df1, on='Label')

print (df)

    Total    Label                     Labels

0  315.59  id|1234           id|1234; id|4957

1  241.17  id|2345           id|2345; id|9342

2  165.87  id|2333  id|2333; id|8321; id|9001

最后一列 :Label


df['Label'] = df.pop('Labels')

print (df)

    Total                      Label

0  315.59           id|1234; id|4957

1  241.17           id|2345; id|9342

2  165.87  id|2333; id|8321; id|9001

另一個具有Series.map和字典理解的解決方案:


d = {y: x for x in match_df['Labels'] for y in x.split('; ')}


source_df['Label'] = source_df['Label'].map(d)

print (source_df)

    Total                      Label

0  315.59           id|1234; id|4957

1  241.17           id|2345; id|9342

2  165.87  id|2333; id|8321; id|9001


查看完整回答
反對 回復 2022-08-25
  • 1 回答
  • 0 關(guān)注
  • 92 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號