Динамически создавать список списков на основе индекса - Python - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать гигантский список результатов со списками списков на основе индекса. Я не могу предопределить, сколько списков будет внутри гигантского списка.

id   value
1     30
1     21
1     12
1     0
2     1
2     9
2     14
3     12
3     2
4     3
5     1

result = []
for id, dfs in df.groupby('id'):
    ....

    for i, row in dfs.iterrows():
        x = helper(row[value])
        # If the list is found, append the element
        if (result[i]):
            result[i].append(x)
        # Dynamically make lists base on index
        else:
            result[i] = []

Если список уже определен, просто добавьте значение x в список.

Ожидаемый результат:

    first index      second index  third index   fourth index
[[x1,x5,x10,x11,x14], [x2,x4,x9], [x3,x7],       [x20]]

значения х вычисляются вспомогательной функцией

1 Ответ

0 голосов
/ 31 октября 2018

Для меня неясно, хотите ли вы, чтобы результат был в виде фрейма данных или диктовался с «индексом» в качестве ключей или просто в виде списка с элементами в правильном порядке. Кстати, списки Python начинаются с индекса 0.

In [706]: result = collections.defaultdict(list)
     ...: for id, dfs in df.groupby('id'):
     ...:     result[id].extend(list(dfs['value'].values))
     ...:

In [707]: result  # this will be a dict
Out[707]:
defaultdict(list,
            {1: [30, 21, 12, 0], 2: [1, 9, 14], 3: [12, 2], 4: [3], 5: [1]})

In [708]: [result[k] for k in sorted(result.keys())]  # turn it into a list
Out[708]: [[30, 21, 12, 0], [1, 9, 14], [12, 2], [3], [1]]

Если вы хотите применить некоторую операцию к каждому элементу в группе, как вы делаете с helper(), вы можете сделать:

In [714]: def helper(val):
     ...:     return 'x' + str(val)  # simplifying whatever helper does

In [715]: result = collections.defaultdict(list)
     ...: for id, dfs in df.groupby('id'):
     ...:     result[id].extend(map(helper, dfs['value'].values))  # pass each value to helper

In [716]: result
Out[716]:
defaultdict(list,
            {1: ['x30', 'x21', 'x12', 'x0'],
             2: ['x1', 'x9', 'x14'],
             3: ['x12', 'x2'],
             4: ['x3'],
             5: ['x1']})

In [717]: [result[k] for k in sorted(result.keys())]
Out[717]:
[['x30', 'x21', 'x12', 'x0'],
 ['x1', 'x9', 'x14'],
 ['x12', 'x2'],
 ['x3'],
 ['x1']]

Обратите внимание, что result[id].extend(...) на самом деле не требуется, поскольку каждая группа значений для этого 'id' будет передаваться вместе. Поэтому вам не нужно проверять, существует ли id в результате. Это могло быть просто:

In [720]: result = collections.defaultdict(list)
     ...: for id, dfs in df.groupby('id'):
     ...:     result[id] = list(map(helper, dfs['value'].values))

В идеале вам нужно создать helper, чтобы его можно было использовать с pd.apply(), работая со всеми строками dfs вместе.

Или, что еще лучше, создайте helper, чтобы он мог что-то делать с кадром данных каждого groupby результата через pd.groupby.GroupBy.apply().

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