簡體   English   中英

基於多個列表在Dataframe中創建新列

[英]Creating a new column in Dataframe based on multiple lists

我正在嘗試根據數據中名為“場地類別”的另一列中的值是否出現在特定列表中,在 dataframe 中創建一個新列“BroadCategory”。 我有 5 個列表用於填寫新列中的值

例如:

df['BroadCategory'] = np.where(df['VenueCategory'].isin(Bar),'Bar','Other') 
df['BroadCategory'] = np.where(df['VenueCategory'].isin(Museum_ArtGallery),'Museum/Art Gallery','Other')
df['BroadCategory'] = np.where(df['VenueCategory'].isin(Public_Transport),'Public Transport','Other')
df['BroadCategory'] = np.where(df['VenueCategory'].isin(Restaurant_FoodVenue),'Restaurant/Food Venue','Other')

我最終希望出現在列表 Bar 中的 VenueCategory 列中的值被標記為“Bar”,而出現在列表 Museum_ArtGallery 中的值被標記為“Museum_ArtGallery”,等等。我上面的代碼沒有做到這一點。

我嘗試這樣做是為了保留我之前填寫的值,但它仍然會覆蓋我根據之前的條件填寫的值:

df['BroadCategory'] = np.where(df[df.VenueCategory!='Other'].isin(Entertainment_Venue),'Entertainment Venue','Other')

如何根據 VenueCategory 列中的值是否出現在指定列表 Bar、Restaurant、Public_Transport、Museum_ArtGallery 等中,用特定值填充 BoardCategory 列?

支持你的數據是這樣的

df=pd.DataFrame({'VenueCategory':['drink','wine','MOMA','MTA','sushi','Hudson']})
Bar=['drink','wine','alcohol']
Museum_ArtGallery=['MOMA','MCM']
Public_Transport=['MTA','MBTA']
Restaurant_FoodVenue=['sushi','chicken']

准備字典:

from collections import defaultdict
d=defaultdict(lambda:'other')
d.update({x:'Bar' for x in Bar})
d.update({x:'Museum_ArtGallery' for x in Museum_ArtGallery})
d.update({x:'Public_Transport' for x in Public_Transport})
d.update({x:'Restaurant_FoodVenue' for x in Restaurant_FoodVenue})

建立新列並打印結果:

df['BroadCategory']=df['VenueCategory'].apply(lambda x:d[x])
df
venue_list = [['Bar', Bar],
               ['Museum_ArtGallery',Museum_ArtGallery]
               #etc
               ]
venue_lookup = pd.concat([
    pd.DataFrame({
        'BroadCategory':venue[0],
        'VenueCategory':venue[1]}) for venue in venue_list]
        )
pd.merge(df, venue_lookup, how='left', on = 'VenueCategory')

您的解決方案已經很接近了。 只是為了不覆蓋以前的值,您應該獲取行的子集,並且只在子集上設置新值。

為此,您可以首先將新列BroadCategory初始化為“其他”。 然后通過使用.isin() function 為新列下標 Boolean 掩碼來設置每個類別的行子集,就像您現在使用的一樣。 代碼如下:

df['BroadCategory'] = 'Other'
df['BroadCategory'][df['VenueCategory'].isin(Bar)] = 'Bar' 
df['BroadCategory'][df['VenueCategory'].isin(Museum_ArtGallery)] = 'Museum/Art Gallery'
df['BroadCategory'][df['VenueCategory'].isin(Public_Transport)] = 'Public Transport'
df['BroadCategory'][df['VenueCategory'].isin(Restaurant_FoodVenue)] = 'Restaurant/Food Venue'
df['BroadCategory'][df['VenueCategory'].isin(Entertainment_Venue)] = 'Entertainment Venue'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM