我需要“复制”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
,并将框架与我拥有的多个属性重复。
此问题的主要目标是提高此逻辑的性能。
答案 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)