2017-01-16 88 views
1

我有两个数组AB其中包含一系列数字。如何提高从Pandas中的数组创建数据帧

我的目标是创建一个数据帧具有以下结构:对BI的每个元素 想对应A.

的所有值例如: 如果A = [0,2,5]B=[4,9,8]欲获得以下对:0-4,0-9,0-82-4,2-9,2-85-4,5-9,5-8

我能够实现我通过以下方式目标:ZZZ但如上所示计算

import pandas as pd 
import numpy as np 

a, b = 1, 10 
c, d = -10, -1 
step = 0.5 

A = np.arange(a,b,1)+step 
B = np.arange(c,d,1) 

df = pd.DataFrame() 
for j in B: 
    for i in A: 
     name = 'H'+str(int(np.abs(i)))+str(int(np.abs(j))) 
     dic = {'XXX':[i],'YYY':[j],'ZZZ':name} 
     df = pd.concat([df,pd.DataFrame(dic)],ignore_index=True) 

列。

我写的代码工作正常,但当我增加a,b,c,d的值时,它非常慢。

有没有更优雅的方式来实现我的目标?我想避免嵌套for循环,它应该是一个比我的显然更有效的方式。

+1

您可以使用[拉链](HTTPS合并列表://文档(A,B),或者你可以直接在pandas中连接列df.XXX.astype(str)+ df.YYY.astype(str)来创建新的专栏。 – BMW

+0

嗯我从来没有听说过它...我现在就去看看 –

回答

1

您可以通过itertools.product创建所有组合。

对于XXX列转换floatint再到str为删除小数,FOM列YYY获得绝对值和转换为str

from itertools import product 
df = pd.DataFrame(list(product(B, A)), columns=['YYY','XXX']) 
#swap columns 
df = df[['XXX','YYY']] 
df['ZZZ'] = 'H' + df.XXX.astype(int).astype(str) + df.YYY.abs().astype(str) 

print (df.head(20)) 
    XXX YYY ZZZ 
0 1.5 -10 H110 
1 2.5 -10 H210 
2 3.5 -10 H310 
3 4.5 -10 H410 
4 5.5 -10 H510 
5 6.5 -10 H610 
6 7.5 -10 H710 
7 8.5 -10 H810 
8 9.5 -10 H910 
9 1.5 -9 H19 
10 2.5 -9 H29 
11 3.5 -9 H39 
12 4.5 -9 H49 
13 5.5 -9 H59 
14 6.5 -9 H69 
15 7.5 -9 H79 
16 8.5 -9 H89 
17 9.5 -9 H99 
18 1.5 -8 H18 
19 2.5 -8 H28 
+0

好的非常感谢:)请问你能否修复索引从0到结尾? –

+0

是的,请参阅编辑。 – jezrael

+1

我找到了更好的解决方案,请检查编辑答案。 – jezrael