Панды создают фрейм данных, записи которого являются связями между строками другого фрейма данных? - PullRequest
1 голос
/ 30 мая 2019

Предположим, у меня есть следующая таблица в CSV.

 elementID | groupID | sequence
     abc   |    A    |    0
     dcv   |    A    |    1
     asd   |    B    |    1
     ccc   |    B    |    0
     abc   |    B    |    2

Я импортировал эту таблицу в Pandas как DataFrame.

Из этого DataFrame мне нужно создать еще один, где каждая запись представляет два двух последовательных элемента elementID.

Например, что-то вроде следующего

 elementID_1 | elementID_2 | groupID
     abc     |    dcv      |    A
     asd     |    abc      |    B
     ccc     |    asd      |    B

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

Поэтому я решил сделать шаг за шагом, создавая один столбец за раз. Сначала я создал столбец elementID_2 следующим образом

new_df = pd.DataFrame()
new_df[["elementID_2", "sequence", "groupID"]] = old_df.loc[old_df.loc.sequence>1][["elementID", "sequence", "groupID"]]

Теперь, чтобы создать столбец elementID_1, я бы хотел сопоставить записи старого фрейма данных со значением sequence, значением sequence нового DataFrame минус 1 и одинаковым groupdID между двумя DataFrame. .

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Вот один из способов использования groupby + itertools

s=df.groupby('groupID').elementID.apply(lambda x : set(itertools.combinations(x.values.tolist(), 2)))
df1=pd.DataFrame(s.index.repeat(s.str.len()))
df2=pd.DataFrame(list(itertools.chain(*s.tolist())))
pd.concat([df1,df2],axis=1)
Out[286]: 
  groupID    0    1
0       A  abc  dcv
1       B  asd  abc
2       B  asd  ccc
3       B  ccc  abc
1 голос
/ 30 мая 2019

IIUC, вы можете сделать это с помощью shift() для групп и dropna:

df.sort_values('sequence', inplace=True)
df['elementID_1'] = df.groupby('groupID').elementID.shift()
df.dropna()

Вывод:

+----+-------------+-----------+------------+---------------+
|    | elementID   | groupID   |   sequence | elementID_1   |
|----+-------------+-----------+------------+---------------|
|  1 | dcv         | A         |          1 | abc           |
|  2 | asd         | B         |          3 | ccc           |
|  4 | abc         | B         |          4 | asd           |
+----+-------------+-----------+------------+---------------+

Затем вы можете удалить sequence столбец и переименоватьelementID до elementID_2.

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