Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将唯一值连接到新数据帧(python、pandas)_Python_Numpy_Pandas_Dataframe_Unique - Fatal编程技术网

将唯一值连接到新数据帧(python、pandas)

将唯一值连接到新数据帧(python、pandas),python,numpy,pandas,dataframe,unique,Python,Numpy,Pandas,Dataframe,Unique,我有两个数据帧,从中我将列的唯一值提取到a和b中 a = df1.col1.unique() b = df2.col2.unique() 现在a和b是这样的 ['a','b','c','d'] #a [1,2,3] #b col1 col2 0 a 1 1 a 2 3 a 3 4 b 1 5 b 2 6 b 3 7 c 1 . . . 它们现在是numpy.ndarray类型 我

我有两个数据帧,从中我将列的唯一值提取到a和b中

a = df1.col1.unique()
b = df2.col2.unique()
现在a和b是这样的

['a','b','c','d'] #a
[1,2,3] #b
   col1  col2
0    a     1
1    a     2
3    a     3
4    b     1
5    b     2
6    b     3
7    c     1
   . . .
它们现在是numpy.ndarray类型

我想加入他们,拥有这样的数据帧

['a','b','c','d'] #a
[1,2,3] #b
   col1  col2
0    a     1
1    a     2
3    a     3
4    b     1
5    b     2
6    b     3
7    c     1
   . . .

有没有不使用循环的方法呢?

更新:

B.M.利用numpy的解决方案要快得多——我建议使用他的方法:

In [88]: %timeit pd.DataFrame({'col1':np.repeat(aa,bb.size),'col2':np.tile(bb,aa.size)})
10 loops, best of 3: 25.4 ms per loop

In [89]: %timeit pd.DataFrame(list(product(aa,bb)), columns=['col1', 'col2'])
1 loop, best of 3: 1.28 s per loop

In [90]: aa.size
Out[90]: 1000

In [91]: bb.size
Out[91]: 1000
尝试:

[56]中的
:a
出[56]:
数组(['a','b','c','d'],

dtype='如果不使用至少一个for循环,则无法执行此任务。最好隐藏for循环或使用隐式
yield
调用来生成内存效率高的生成器

itertools
为此任务导出有效函数,隐式使用
yield
返回生成器:

from itertools import product

products = product(['a','b','c','d'], [1,2,3])

col1_items, col2_items = zip(*products)

result = pandas.DataFrame({'col1':col1_items, 'col2': col2_items})

itertools.product
创建一个包含两个iterables的列表。
zip(*products)
只需将生成的元组列表解压为两个单独的元组,如图所示。

您可以使用pandas merge完成此操作,它比itertools或循环更快:

df_a = pd.DataFrame({'a': a, 'key': 1})
df_b = pd.DataFrame({'b': b, 'key': 1})
result = pd.merge(df_a, df_b, how='outer')
结果:

    a  key  b
0   a    1  1
1   a    1  2
2   a    1  3
3   b    1  1
4   b    1  2
5   b    1  3
6   c    1  1
7   c    1  2
8   c    1  3
9   d    1  1
10  d    1  2
11  d    1  3
如果需要的话,你可以一直这样做

del result['key']
使用numpy工具:

pd.DataFrame({'col1':np.repeat(a,b.size),'col2':np.tile(b,a.size)})

列表理解可以接受吗?我需要它DataFrame@RoseAlejandra-不,我是问,为了创建数据帧,列表理解是否可以接受。你说没有“for循环”,哪些列表理解隐式使用,而不是显式使用。我不介意隐式使用它们@AkshatMahajan@RosaAlejandra,请留意B.M.的解决方案-它的持久性要快得多
itertools.product(a,B)
返回一个由元组组成的迭代器,我怀疑对
[[x[0],x[1]]
的额外列表理解是不必要的。