Здравствуйте, я пытаюсь сделать список поиска, что с учетом listID я могу найти пользователей, которые имеют его, и с учетом UserID я могу найти все списки этого пользователя.

Данные поступают в следующем формате:

[['34', '345'],
['12', '23,534,34'],
['1', '13,42']]

То, что я хотел бы, это информационный кадр панд, который выглядит как:

UserID, ListID
34, 345
12, 23
12, 534
12, 34
 1, 13
 1, 42

Мои мысли заключались в том, чтобы сделать вторую строку списка, разделенного на «запятые», но оттуда я застрял. Какие-либо предложения?

2
Steffen Hvid 28 Авг 2017 в 15:38

3 ответа

Лучший ответ

Вы должны очистить ваши данные, прежде чем вводить их в конструктор фрейма данных. Вот простой скрипт:

import pandas as pd

data = [['34', '345'],
['12', '23,534,34'],
['1', '13,42']]

new_data = []
for row in data:
    x, yvals = row
    for y in yvals.split(','):
        new_data.append([x,y])

df = pd.DataFrame(new_data, columns=['UserID', 'ListID'])
5
James 28 Авг 2017 в 12:47

Вы можете сделать следующим образом:

df_tmp = pd.DataFrame([['34', '345'],
['12', '23,534,34'],
['1', '13,42']], columns=['ListID', 'UserIDs'])

s = df_tmp['UserIDs'].str.split(',', expand=True).stack()
i = s.index.get_level_values(0)
df = df_tmp.loc[i].copy()
df["UserID"] = s.values
del df['UserIDs']
0
DavidK 28 Авг 2017 в 12:52

Вот один из способов

In [386]: L = [['34', '345'], ['12', '23,534,34'], ['1', '13,42']]

In [387]: (pd.DataFrame(L, columns=['UserID', 'ListID'])
             .set_index('UserID')
             .ListID.str.split(',')
             .apply(pd.Series)
             .stack()
             .reset_index(level=0, name='ListID'))
Out[387]:
  UserID ListID
0     34    345
1     12     23
2     12    534
3     12     34
4      1     13
5      1     42
1
Zero 28 Авг 2017 в 12:45