使用来自数组元组的列构建DataFrame

时间:2016-08-22 19:16:10

标签: python pandas numpy dataframe

我正在努力完成从np.unique(arr, return_counts=True)生成的元组构造按值计数的DataFrame的基本任务,例如:

import numpy as np
import pandas as pd

np.random.seed(123)  
birds=np.random.choice(['African Swallow','Dead Parrot','Exploding Penguin'], size=int(5e4))
someTuple=np.unique(birds, return_counts = True)
someTuple
#(array(['African Swallow', 'Dead Parrot', 'Exploding Penguin'], 
#       dtype='<U17'), array([16510, 16570, 16920], dtype=int64))

首先我试过

pd.DataFrame(list(someTuple))
# Returns this:
#                  0            1                  2
# 0  African Swallow  Dead Parrot  Exploding Penguin
# 1            16510        16570              16920

我也试过pd.DataFrame.from_records(someTuple),它返回同样的东西。

但我正在寻找的是:

#              birdType      birdCount
# 0     African Swallow          16510  
# 1         Dead Parrot          16570  
# 2   Exploding Penguin          16920

什么是正确的语法?

4 个答案:

答案 0 :(得分:4)

使用您的元组,您可以执行以下操作:

In [4]: pd.DataFrame(list(zip(*someTuple)), columns = ['Bird', 'BirdCount'])
Out[4]: 
                Bird  BirdCount
0    African Swallow      16510
1        Dead Parrot      16570
2  Exploding Penguin      16920

答案 1 :(得分:4)

这是一个基于NumPy的解决方案np.column_stack -

pd.DataFrame(np.column_stack(someTuple),columns=['birdType','birdCount'])

np.vstack -

pd.DataFrame(np.vstack(someTuple).T,columns=['birdType','birdCount'])

np.transposenp.column_stacknp.vstack进行基准测试,以便将1D数组放入列中以形成2D数组 -

In [54]: tup1 = (np.random.rand(1000),np.random.rand(1000))

In [55]: %timeit np.transpose(tup1)
100000 loops, best of 3: 15.9 µs per loop

In [56]: %timeit np.column_stack(tup1)
100000 loops, best of 3: 11 µs per loop

In [57]: %timeit np.vstack(tup1).T
100000 loops, best of 3: 14.1 µs per loop

答案 2 :(得分:4)

创建字典

pd.DataFrame(dict(birdType=someTuple[0], birdCount=someTuple[1]))

enter image description here

答案 3 :(得分:2)

你可以使用Counter。

from collections import Counter

c = Counter(birds)

>>> pd.Series(c)
African Swallow      16510
Dead Parrot          16570
Exploding Penguin    16920
dtype: int64

你也可以在系列剧中使用value_counts

>>> pd.Series(birds).value_counts()
Exploding Penguin    16920
Dead Parrot          16570
African Swallow      16510
dtype: int64