Поиск строки из каждой строки ячейки в другом столбце и, если совпадение найдено, вставьте строку ниже найденного совпадения в пандах - PullRequest
0 голосов
/ 20 декабря 2018

Как я могу проверить значение из ячейки столбца «B» (оно может содержать несколько строк), находится ли оно в столбце «A», и если оно есть, вставляет строку отверстия (например, в которой у меня есть значения m32 \ nm83 \ nm18) ниже строки, в которой совпадение найдено в столбце «A» (например, m32)?

Это кадр данных:

df

  A      B                  C
  m55    m32\nm83\nm18      123
  m56    m12                546
  m68
  m32
  m83
  m65
  m73    m77\nm78           558
  m23
  m98
  m77
  m18
  m4
  m12
  m78

И это то, чтоЯ хочу получить:

df

   A      B                  C
  m55    m32\nm83\nm18      123
  m56    m12                546
  m68
  m32
  m55    m32\nm83\nm18      123
  m83
  m55    m32\nm83\nm18      123
  m65
  m73    m77\nm78           558
  m23
  m98
  m77
  m73    m77\nm78           558
  m18
  m55    m32\nm83\nm18      123
  m4
  m12
  m56    m12                546
  m78
  m73    m77\nm78           558

Я пытался с этим:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

dfB = dfB[dfB.apply(lambda x: isinstance(x, str))]
dfBidx = dfB.index

j=0
for b in dfBidx:
    try:
        idx = df.index[df["A"].apply(lambda x: isinstance(x, str)).str.contains("|".join(dfB[b].split("\n")))]
        for i in idx:
            i+=j
            df_new = df.loc[i]
            df = insert_row(i+j+1, df, df_new)
            j+= int(df_new.size/len(df_new.columns.values))
    except:
        pass

Это какой-то другой способ сделать это?У меня есть проблема со значениями NaN в столбце «А», и, как правило, есть некоторые несоответствия в использовании функций:

str (), содержит (), apply ()

РЕДАКТИРОВАТЬ:

У меня есть второй кадр данных (df2), из которого я извлекаю строки и вставляю в df.Я извлекаю строки из «test» в «test» в столбце «Ключевое слово».

df2

  Keyword      B                  C
  test         m32\nm83\nm18      123
  something
  something
  something
  test
  something
  something
  test         m12                546
  something
  test         m77\nm78           558
  test
  something

Итак, в конце мне нужно это:

дф

  A         Keyword      B                  C
  m55                    m32\nm83\nm18      123
  m56                    m12                546
  m68
  m32
            test         m32\nm83\nm18      123
            something
            something
            something
  m83
            test         m32\nm83\nm18      123
            something
            something
            something
  m65
  m73                    m77\nm78           558
  m23
  m98
  m77
            test         m77\nm78           558
  m18
            test         m32\nm83\nm18      123
            something
            something
            something
  m4
  m12
            test         m12                546
            something
  m78
            test         m77\nm78           558

1 Ответ

0 голосов
/ 20 декабря 2018

Решение, работающее со значением по умолчанию RangeIndex.

Crate словарь индекса вставленных строк с индексом исходной строки (d1) и повторяющихся строк в списке, также добавьте 0.5 для правильного упорядочения.Последняя concat все вместе, sort_index и создание индекса по умолчанию reset_index:

d = df['B'].dropna().to_dict()
print (d)
{0: 'm32\\nm83\\nm18', 1: 'm12', 6: 'm77\\nm78'}

d1 = {k: df.index[df['A'].str.contains("|".join(v.split("\\n")))] for k, v in d.items()}
print (d1)
{0: Int64Index([3, 4, 10], dtype='int64'), 
 1: Int64Index([12], dtype='int64'), 
 6: Int64Index([9, 13], dtype='int64')}

L = [pd.concat([df.loc[[k]]] * len(v)).set_index([v + .5]) for k, v in d1.items()]

df = pd.concat([df] + L).sort_index().reset_index(drop=True)
print (df)
      A              B      C
0   m55  m32\nm83\nm18  123.0
1   m56            m12  546.0
2   m68            NaN    NaN
3   m32            NaN    NaN
4   m55  m32\nm83\nm18  123.0
5   m83            NaN    NaN
6   m55  m32\nm83\nm18  123.0
7   m65            NaN    NaN
8   m73       m77\nm78  558.0
9   m23            NaN    NaN
10  m98            NaN    NaN
11  m77            NaN    NaN
12  m73       m77\nm78  558.0
13  m18            NaN    NaN
14  m55  m32\nm83\nm18  123.0
15   m4            NaN    NaN
16  m12            NaN    NaN
17  m56            m12  546.0
18  m78            NaN    NaN
19  m73       m77\nm78  558.0
...