Дублирование фрейма данных в зависимости от элементов коллекции - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно «продублировать» элементы DataFrame столько раз, сколько элементов в коллекции (скажем, список, чтобы упростить его).Это может быть трудно объяснить словами, поэтому я покажу свой код:

In [1]: data = {char: [] for char in 'abcd'}
In [2]: n = 3
In [3]: properties = [i for i in range(1, n + 1)]
In [4]: l = list(range(1, 11))
In [5]: for e in l:
    ...:     data['a'].append(e + e)
    ...:     data['b'].append(e * e)
    ...:     data['c'].append(e ** e)
    ...:     data['d'].append(1.0 / e)
    ...:
In [6]: df = pd.DataFrame(data)
In [7]: df
Out[7]: 
    a    b            c         d
0   2    1            1  1.000000
1   4    4            4  0.500000
2   6    9           27  0.333333
3   8   16          256  0.250000
4  10   25         3125  0.200000
5  12   36        46656  0.166667
6  14   49       823543  0.142857
7  16   64     16777216  0.125000
8  18   81    387420489  0.111111
9  20  100  10000000000  0.100000

в зависимости от свойств, мне нужно создать следующее DataFrame:

     a    b            c         d  property
0    2    1            1  1.000000         1
1    4    4            4  0.500000         1
2    6    9           27  0.333333         1
3    8   16          256  0.250000         1
4   10   25         3125  0.200000         1
5   12   36        46656  0.166667         1
6   14   49       823543  0.142857         1
7   16   64     16777216  0.125000         1
8   18   81    387420489  0.111111         1
9   20  100  10000000000  0.100000         1
10   2    1            1  1.000000         2
11   4    4            4  0.500000         2
12   6    9           27  0.333333         2
13   8   16          256  0.250000         2
14  10   25         3125  0.200000         2
15  12   36        46656  0.166667         2
16  14   49       823543  0.142857         2
17  16   64     16777216  0.125000         2
18  18   81    387420489  0.111111         2
19  20  100  10000000000  0.100000         2
20   2    1            1  1.000000         3
21   4    4            4  0.500000         3
22   6    9           27  0.333333         3
23   8   16          256  0.250000         3
24  10   25         3125  0.200000         3
25  12   36        46656  0.166667         3
26  14   49       823543  0.142857         3
27  16   64     16777216  0.125000         3
28  18   81    387420489  0.111111         3
29  20  100  10000000000  0.100000         3

, котороеповторить мой массив данных в зависимости от количества элементов в свойствах и добавив свойство столбца.В настоящее время я использую вложенные циклы с двумя циклами, чтобы добиться этого следующим образом:

new_data = {'a': [], 'b': [], c: [], d: [], 'property': []}
properties = [1, 2, 3]
for property_id in properties:
    for e in l:
        new_data['property'].append(property_id)
        new_data['a'].append(e + e)
        new_data['b'].append(e * e)
        new_data['c'].append(e ** e)
        new_data['d'].append(1.0 / e)
new_df = pd.DataFrame(new_data)

Однако я надеюсь, что есть способ упростить эту логику, просто используя свой оригинальный словарь data или dfи дублируя фрейм как можно больше свойств.

Основная цель этой проблемы - улучшить производительность этой логики.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вам нужен список фреймов данных, а затем объединить их с добавлением нового столбца каждый раз.

dfs = [df.assign(property=k)  for k in properties]
data = pd.concat(dfs, ignore_index=True)
0 голосов
/ 18 мая 2018

concat

Вы ищете concat df с собой?

df = pd.concat(
       [df] * len(properties), ignore_index=True
).assign(property=np.repeat(properties, len(df)))

reindex + tile

df = df.reindex(np.tile(df.index, len(properties))).assign(
    property=np.repeat(properties, len(df))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...