根据集合

时间:2018-05-18 16:48:47

标签: python pandas

我需要“复制”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 :(得分:3)

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))
)

答案 1 :(得分:1)

您需要一个数据框列表,然后每次都添加一个新列来连接它们。

dfs = [df.assign(property=k)  for k in properties]
data = pd.concat(dfs, ignore_index=True)