簡體   English   中英

使用Pandas從另一個數據框中包含的值中檢測數據框中的索引

[英]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

注意:如果找不到該名稱,則不需要存儲任何信息。

我認為您可以將mergegroupby一起使用,並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.

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