我正在努力完成从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
什么是正确的语法?
答案 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.transpose
,np.column_stack
和np.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)
答案 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