在包含组中数字元素的pandas数据框中创建列(groupby)

时间:2017-06-25 19:21:03

标签: python pandas grouping stata

我正在分析一个大型数据集,其中包含每个主题的可变数量的观察结果(范围从1次出现到26次出现......)。由于我需要分析事件之间的时间,因此只有一次事件的主题是无信息的。

以前,在Stata工作时,我会使用Stata代码分配一个变量(例如,总计):

by idnummer,sort:gen total = _N

这样每一行/主题都有一个变量'total',我可以消除所有主题总数= 1.

我一直在尝试使用agg功能和大小,但我最终选择'NaN'......

PS:使用侧面的“类似问题”,我找到了自己问题的答案....

df ['total'] = df.groupby('idnummer')['sequence'] .transform('max')

2 个答案:

答案 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_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]

答案 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())