[英]Detect indexes of a dataframe from values contained in another dataframe with Pandas
我有2個數據框:
# dataframe 1
data = {'Name':['PINO','PALO','TNCO' ,'TNTO','CUCO' ,'FIGO','ONGF','LABO'],
'Id' :[ 10 , 9 ,np.nan , 14 , 3 ,np.nan, 7 ,np.nan]}
df1 = pd.DataFrame(data)
和
# dataframe 2
convert_table = {'XXX': ['ALLO','BELO','CACO','CUCO','DADO','FIGO','FIGO','ONGF','PALO','PALO','PINO','TNCO','TNCO','TNCO','TNTO']}
df2 = pd.DataFrame(convert_table)
我的目標是確定遵循以下條件的df2['XXX']
元素的索引:
df1['Name']
df1['Id'] = NaN
通過使用以下代碼行,我能夠實現自己的目標:
nan_names = df1['Name'][df1['Id'].isnull()]
df3 = pd.DataFrame()
for name in nan_names:
index = df2[df2['XXX']==name].index.tolist()
if index:
dic = {'name':[name] , 'index':[index]}
df3 = pd.concat([df3,pd.DataFrame(dic)], ignore_index=True)
但是我想知道是否有一種更有效,更優雅的方法來實現我的目標。
結果應如下所示:
index name
0 [11, 12, 13] TNCO
1 [5, 6] FIGO
注意:如果找不到該名稱,則不需要存儲任何信息。
我認為您可以將merge
與groupby
一起使用,並apply
list
:
nan_names = df1.loc[df1['Id'].isnull(), ['Name']]
print (nan_names)
Name
2 TNCO
5 FIGO
7 LABO
df = pd.merge(df2.reset_index(), nan_names, on='Name', suffixes=('','_'))
print (df)
index Name
0 5 FIGO
1 6 FIGO
2 11 TNCO
3 12 TNCO
4 13 TNCO
print (df.groupby('Name')['index'].apply(list).reset_index())
Name index
0 FIGO [5, 6]
1 TNCO [11, 12, 13]
您正在尋找isin
方法:
df = df2[df2['XXX'].isin(nan_names)]
這將返回:
XXX
5 FIGO
6 FIGO
11 TNCO
12 TNCO
13 TNCO
從那里開始,只需格式化即可:
df.reset_index().groupby('XXX')['index'].apply(list)
這將返回:
XXX
FIGO [5, 6]
TNCO [11, 12, 13]
這個想法是重置索引,使其成為一列(名為index
)。 按名稱分組並應用list
功能將返回每個名稱的原始索引列表。
再次調用reset_index
將返回您想要的結果。
編輯
將所有內容組合成一個直線,這將是輸出:
In [21]: df2[df2['XXX'].isin(nan_names)].reset_index().groupby('XXX')['index'].apply(list).reset_index()
Out[21]:
XXX index
0 FIGO [5, 6]
1 TNCO [11, 12, 13]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.