簡體   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