将唯一值连接到新数据帧(python、pandas)
我有两个数据帧,从中我将列的唯一值提取到a和b中将唯一值连接到新数据帧(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 = 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]]
的额外列表理解是不必要的。