使用Pandas从包含于另一个dataframe中的值检测dataframe的索引

2024-06-13 11:55:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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']
  • 有相应的

我通过使用以下代码行实现了我的目标:

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

注意:如果找不到名称,则不需要存储任何信息。你知道吗


Tags: name目标dataframeindexnpnanxxxpd
2条回答

我想你可以用^{}^{}applylist

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]

相关问题 更多 >