我有一个pandas数据帧,它有一个名为my_labels
的列,其中包含字符串:'A', 'B', 'C', 'D', 'E'
。我想计算每个字符串出现的次数,然后将计数的数量除以所有计数的总和。我试着在Pandas中这样做:
func = lambda x: x.size() / x.sum()
data = frame.groupby('my_labels').apply(func)
这段代码抛出一个错误,'DataFrame对象没有'size‘属性。我如何在Pandas中应用函数来计算这个值呢?
发布于 2018-01-04 16:03:05
除了As of Pandas version 0.22,还有一种替代apply
的方法:pipe
,它比使用apply
快得多(您还可以查看this question了解这两种功能之间的更多差异)。
对于您的示例:
df = pd.DataFrame({"my_label": ['A','B','A','C','D','D','E']})
my_label
0 A
1 B
2 A
3 C
4 D
5 D
6 E
apply
版本
df.groupby('my_label').apply(lambda grp: grp.count() / df.shape[0])
给出
my_label
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
和pipe
版本
df.groupby('my_label').pipe(lambda grp: grp.size() / grp.size().sum())
收益率
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
因此,值是相同的,但是,计时差别很大(至少对于这个小数据帧是如此):
%timeit df.groupby('my_label').apply(lambda grp: grp.count() / df.shape[0])
100 loops, best of 3: 5.52 ms per loop
和
%timeit df.groupby('my_label').pipe(lambda grp: grp.size() / grp.size().sum())
1000 loops, best of 3: 843 µs per loop
然后,将其封装到一个函数中也很简单:
def get_perc(grp_obj):
gr_size = grp_obj.size()
return gr_size / gr_size.sum()
现在您可以调用
df.groupby('my_label').pipe(get_perc)
让位
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
但是,对于这种特殊情况,您甚至不需要groupby
,但可以像这样使用value_counts
:
df['my_label'].value_counts(sort=False) / df.shape[0]
让位
A 0.285714
C 0.142857
B 0.142857
E 0.142857
D 0.285714
Name: my_label, dtype: float64
对于这个小数据帧,它是相当快的
%timeit df['my_label'].value_counts(sort=False) / df.shape[0]
1000 loops, best of 3: 770 µs per loop
正如@anmol所指出的,最后一条语句也可以简化为
df['my_label'].value_counts(sort=False, normalize=True)
发布于 2013-03-13 09:04:35
尝试:
g = pd.DataFrame(['A','B','A','C','D','D','E'])
# Group by the contents of column 0
gg = g.groupby(0)
# Create a DataFrame with the counts of each letter
histo = gg.apply(lambda x: x.count())
# Add a new column that is the count / total number of elements
histo[1] = histo.astype(np.float)/len(g)
print histo
输出:
0 1
0
A 2 0.285714
B 1 0.142857
C 1 0.142857
D 2 0.285714
E 1 0.142857
发布于 2018-07-20 06:38:00
关于“size”的问题,size不是数据帧上的函数,而是一个属性。因此,不是使用size(),而是使用普通大小
除此之外,像这样的方法应该是可行的。
def doCalculation(df):
groupCount = df.size
groupSum = df['my_labels'].notnull().sum()
return groupCount / groupSum
dataFrame.groupby('my_labels').apply(doCalculation)
https://stackoverflow.com/questions/15374597
复制相似问题