[英]Creating a column in a pandas dataframe containing the number elements in the group (groupby)
我正在分析一个大型数据集,其中每个主题包含可变数量的观察值(范围从1次出现到26次出现...)。 由于我需要分析两次事件之间的时间,因此仅发生一次的主题是非信息性的。
以前,在Stata中工作时,我将使用Stata代码分配变量(例如,称为total):
按idnummer排序:gen total = _N
这样,每个行/主题都有一个变量“总计”,我可以消除所有主题合计= 1。
我一直在尝试使用agg函数和大小,但最终以'NaN'结尾...
PS:通过侧面的“类似问题”,我找到了自己问题的答案。
df ['total'] = df.groupby('idnummer')['sequence']。transform('max')
首先,您的问题令人困惑。 考虑对其进行编辑以使其清晰。
其次,IIUC,您希望消除包含仅在一列中出现一次的列中的值的行。
设定
考虑数据帧df
的样本数据
import pandas as pd
import numpy as np
from string import ascii_uppercase
np.random.seed([3,1415])
df = pd.DataFrame(dict(mycol=np.random.choice(list(ascii_uppercase), 50)))
pd.value_counts
我们可以在此解决方案和其他解决方案中使用mycol
列的每个元素的频率。
vc = df.mycol.value_counts()
vc
N 5
H 4
X 4
W 4
L 3
M 3
A 3
T 3
F 2
Z 2
E 2
S 2
C 2
D 2
Y 2
U 2
Q 1
G 1
K 1
P 1
I 1
Name: mycol, dtype: int64
选项1
pd.value_counts
和map
我们可以看到['Q', 'G', 'K', 'P', 'I']
都是单个出现。 使用map
将mycol
转换为相对计数并进行过滤。
df[df.mycol.map(vc) > 1]
选项2
np.bincount
和np.unique
f = np.unique(df.mycol.values, return_inverse=True)[1]
df[np.bincount(f)[f] > 1]
您实际上并不需要groupby,只计算每个字符串的出现数会更简单一些:
df['total'] = df.idnumber.apply(lambda x: df.idnumber.str.count(x).sum())
或者,您也可以像这样映射值计数:
df['total'] = df.idnumber.map(df.idnumber.value_counts())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.