繁体   English   中英

在熊猫数据框中创建一个包含组中数字元素的列(groupby)

[英]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_countsmap

我们可以看到['Q', 'G', 'K', 'P', 'I']都是单个出现。 使用mapmycol转换为相对计数并进行过滤。

df[df.mycol.map(vc) > 1]

选项2
np.bincountnp.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM