Как сравнить содержимое ячейки фрейма данных pandas с предыдущей ячейкой (или другим заранее заданным расстоянием) - PullRequest
1 голос
/ 02 ноября 2019

У меня есть Pandas Dataframe, содержащий столбец идентификаторов (1 и 2) и столбец списков слов. Я пытаюсь найти пересечение слов между двумя ячейками в заранее заданных положениях:

import pandas as pd
df = pd.DataFrame({'ID': ['S1','S2','S1','S2','S1','S2','S1','S2'], 'words': [['apple', 'orange'],
                      ['apple', 'pear'],['melon', 'pineapple'],['apple', 'melon'],['melon', 'fig'],
                      ['plum', 'fig'],['melon', 'apple'],['apple', 'pineapple']]})

Более конкретно, в приведенном выше DF я хочу сравнить слова в каждой ячейке (которую мы назовем pos: 0) со словами в предыдущей ячейке (которую мы назовем pos: -1) и сохраняем слова, которые встречаются в новом столбце (называемом «совпадениями»), в той же строке, что и ячейка в pos: 0.

Например, вторая строка содержит слова «яблоко» и «груша». «Яблоко» также встречается в предыдущем ряду, а «груша» - нет. Итак, я бы хотел, чтобы «яблоко» появилось в столбце «совпадения» во втором ряду.

Если возможно, я бы хотел установить меру «расстояния», которая позволит мне сравнивать ячейки на разных расстояниях друг от друга. Например, если предыдущая строка равна -1, то предыдущая строка будет иметь значение -2, -3, -4 и т. Д.

В настоящее время я делаю это в Пандах, но понятия не имею, если эторазумноПока у меня нет реального кода, иллюстрирующего мои усилия, потому что я не знаю, с чего начать.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Используйте Groupby.transform для создания совпадений между обоими списками:

s1=df.ID.eq('S1')
groups=s1.cumsum()
df['matches']=( df.groupby(groups) 
                  .transform(lambda x: list(set(x.iat[0]) & set(x.iat[1])))
                  .words
                  .where(~s1) )
print(df)

   ID               words  matches
0  S1     [apple, orange]      NaN
1  S2       [apple, pear]  [apple]
2  S1  [melon, pineapple]      NaN
3  S2      [apple, melon]  [melon]
4  S1        [melon, fig]      NaN
5  S2         [plum, fig]    [fig]
6  S1      [melon, apple]      NaN
7  S2  [apple, pineapple]  [apple]

Деталь:

print(groups)

0    0
1    0
2    1
3    1
4    2
5    2
6    3
7    3
Name: ID, dtype: int64
1 голос
/ 02 ноября 2019

Дублируйте столбец 'words' и сдвиньте его:

df["w2"]=df.words.shift()                                                                                            

   ID               words                  w2
0  S1     [apple, orange]                 NaN
1  S2       [apple, pear]     [apple, orange]
2  S1  [melon, pineapple]       [apple, pear]
3  S2      [apple, melon]  [melon, pineapple]
4  S1        [melon, fig]      [apple, melon]
5  S2         [plum, fig]        [melon, fig]
6  S1      [melon, apple]         [plum, fig]
7  S2  [apple, pineapple]      [melon, apple]

Затем вычислите расстояние 1:

df["d-1"]=df.apply(lambda r: np.intersect1d(r.words,r.w2), axis=1)                                                   

   ID               words                  w2      d-1
0  S1     [apple, orange]                 NaN       []
1  S2       [apple, pear]     [apple, orange]  [apple]
2  S1  [melon, pineapple]       [apple, pear]       []
3  S2      [apple, melon]  [melon, pineapple]  [melon]
4  S1        [melon, fig]      [apple, melon]  [melon]
5  S2         [plum, fig]        [melon, fig]    [fig]
6  S1      [melon, apple]         [plum, fig]       []
7  S2  [apple, pineapple]      [melon, apple]  [apple]

Вы можете снова выполнить 'w2' и вычислить расстояние 2:

df.w2.shift()
df["d-2"]=df.apply(lambda r: np.intersect1d(r.words,r.w2), axis=1)

и так далее. Вы можете использовать петлю, если вам нужны все расстояния.

0 голосов
/ 02 ноября 2019

Этот скрипт делает именно то, что вы ищете

df['matches']=''
for idx in df.index:
    if idx>0:
        for fruit in df.loc[idx][1]:
            if fruit in df.loc[idx-1][1]:
                df['matches'][idx]=fruit
            else:
                continue


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...