我正在分析一个大型数据集,其中包含每个主题的可变数量的观察结果(范围从1次出现到26次出现......)。由于我需要分析事件之间的时间,因此只有一次事件的主题是无信息的。
以前,在Stata工作时,我会使用Stata代码分配一个变量(例如,总计):
by idnummer,sort:gen total = _N
这样每一行/主题都有一个变量'total',我可以消除所有主题总数= 1.
我一直在尝试使用agg功能和大小,但我最终选择'NaN'......
PS:使用侧面的“类似问题”,我找到了自己问题的答案....
df ['total'] = df.groupby('idnummer')['sequence'] .transform('max')
答案 0 :(得分:0)
首先,你的问题令人困惑。考虑对其进行编辑以使其清晰。
其次,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]
答案 1 :(得分:0)
你实际上并不需要groupby,只需计算每个字符串的出现次数就更简单了:
df['total'] = df.idnumber.apply(lambda x: df.idnumber.str.count(x).sum())
或者您可以像这样映射值计数:
df['total'] = df.idnumber.map(df.idnumber.value_counts())