Python的熊猫KeyError异常: '标签不在[指数]'

问题描述:

我有索引的duplicates_to_fetch数据帧:Python的熊猫KeyError异常: '标签不在[指数]'

  mail_domaine   Values 
0     @A.com   [0, 2] 
1     @B.com   [1, 4] 

和以下df_to_rearrange数据帧

 movie_name    df_pname 
0    A    [mr a] 
1    B    [mr b] 
2    Aa    [mr aa] 
3    D    [mr d] 
4    Bb  [mr Bb, mr Bbb] 
5    E    [mr e] 

我想具有以下转换后的数据帧

 movie_name     df_pname 
0   [A, Aa]    [mr a, mr aa] 
1   [B, Bb]  [mr b, mr Bb, mr Bbb] 
3    [D]      [mr d] 
5    [E]      [mr e]  

但是......当我放下行,算法停止,因为缺少指数

我不喜欢

for i in range(0,len(druplicates_to_fetch)): 
     mylist = duplicates_to_fetch.loc[i,"Values"] 
     index_to_fetch_on = mylist[0] 

     # rearrange mylist (which can have >2 values) 
     mylist = [myindex for myindex in mylist if myindex != index_to_fetch_on] 

     for j in mylist: 
      df_to_rearrange.loc[index_to_fetch, "df_pname"].append(df_to_rearrange.loc[j, "df_pname"]) 
      df_to_rearrange.drop(df_to_rearrange.index[j], inplace=True) 

的错误是以下KeyError: 'the label [179] is not in the [index]'。那里有更多的Pythonic方式来做到这一点?

+1

迭代用'对于i(0,LEN(duplicates_to_fetch)):MYLIST = duplicates_to_fetch.loc [我,“价值观”]是笨重的。更好的办法是:'为我,duplicate_row in duplicates_to_fetch.iterrows()' – smci

+1

另外,'mylist = [ix for ix in mylist if ix!= index_to_fetch_on]'看起来像一个简单的'drop()'操作。 – smci

一种解决方案是

df_to_rearrange.drop(df_to_rearrange.index[np.where((df_to_rearrange.index==j))], inplace=True) 

这里的另一种方式来做到这一点。在使用范围为lookup组和agg的列list

In [78]: lookup = {v: i for i, x in enumerate(duplicates_to_fetch['Values']) for v in x} 

In [79]: (df_to_rearrange.groupby(df_to_rearrange.index.to_series().map(lookup).fillna('')) 
      .agg({'movie_name': lambda x: [v for v in x], 
        'df_pname': lambda x: [a for v in x.values for a in v]}) 
      .reset_index(drop=True)) 
Out[79]: 
    movie_name    df_pname 
0 [A, Aa]   [mr a, mr aa] 
1 [B, Bb] [mr b, mr Bb, mr Bbb] 
2  [D]     [mr d] 

详细

In [959]: duplicates_to_fetch 
Out[959]: 
    mail_domaine Values 
0  @A.com [0, 2] 
1  @B.com [1, 4] 

In [960]: df_to_rearrange 
Out[960]: 
    movie_name   df_pname 
0   A   [mr a] 
1   B   [mr b] 
2   Aa   [mr aa] 
3   D   [mr d] 
4   Bb [mr Bb, mr Bbb] 
In [958]: lookup 
Out[958]: {0: 0, 1: 1, 2: 0, 4: 1} 
+0

问题是'lambda x:list(x)',但这是由于我的数据 –

+0

现在更新为这种情况 – Zero

+0

您的代码将我的df从1135减少到37而不是1094(我的脚本完全呈现我想要的)。出于某种原因(group_by我认为),您的代码将一组1781个值! 也许如果你用'[mr E]'添加一行'E',你会看到pb –