[英]Iterate through rows in pandas dataframe and match tuples from a list and create a new df column
[英]Iterate through rows of grouped pandas dataframe to create new columns
我是Python的新手,正在嘗試與Pandas進行數據分析。
我想知道是否有人可以幫助我遍歷數據框中的分組數據行以創建新變量。
假設我有一個名為data的數據框,如下所示:
+----+-----------+--------+ | ID | YearMonth | Status | +----+-----------+--------+ | 1 | 201506 | 0 | | 1 | 201507 | 0 | | 1 | 201508 | 0 | | 1 | 201509 | 0 | | 1 | 201510 | 0 | | 2 | 201506 | 0 | | 2 | 201507 | 1 | | 2 | 201508 | 2 | | 2 | 201509 | 3 | | 2 | 201510 | 0 | | 3 | 201506 | 0 | | 3 | 201507 | 1 | | 3 | 201508 | 2 | | 3 | 201509 | 3 | | 3 | 201510 | 4 | +----+-----------+--------+
每個ID有多個行,MonthYear的格式為yyyymm,Status是每個MonthYear的狀態(取值0到6)
我已經創建了一些列以向我顯示累計最大狀態,以及一個ever3(向我顯示一個ID是否曾經具有一個狀態或3個或更多,而不管當前狀態如何)指示器,如下所示:
data1['Max_Stat'] = data1.groupby(['Custno'])['Status'].cummax()
data1['Ever3'] = np.where(data1['Max_Stat'] >= 3, 1, 0)
我還想做的是創建其他列以創建指標,例如發生某事的次數或事件發生后的時間。 例如
Times3Plus:顯示該時間點ID的狀態為3或更多的次數
Into3:ID第一次狀態為3或更大時設置為Y(以后不再使用)
+----+-----------+--------+----------+-------+------------+-------+ | ID | YearMonth | Status | Max_Stat | Ever3 | Times3Plus | Into3 | +----+-----------+--------+----------+-------+------------+-------+ | 1 | 201506 | 0 | 0 | 0 | 0 | | | 1 | 201507 | 0 | 0 | 0 | 0 | | | 1 | 201508 | 0 | 0 | 0 | 0 | | | 1 | 201509 | 0 | 0 | 0 | 0 | | | 1 | 201510 | 0 | 0 | 0 | 0 | | | 2 | 201506 | 0 | 0 | 0 | 0 | | | 2 | 201507 | 1 | 1 | 0 | 0 | | | 2 | 201508 | 2 | 2 | 0 | 0 | | | 2 | 201509 | 3 | 3 | 1 | 1 | Y | | 2 | 201510 | 0 | 3 | 1 | 1 | | | 3 | 201506 | 0 | 0 | 0 | 0 | | | 3 | 201507 | 1 | 1 | 0 | 0 | | | 3 | 201508 | 2 | 2 | 0 | 0 | | | 3 | 201509 | 3 | 3 | 1 | 1 | Y | | 3 | 201510 | 4 | 4 | 1 | 2 | | +----+-----------+--------+----------+-------+------------+-------+
我可以使用BY和RETAIN語句在SAS中很容易地做到這一點,但無法弄清楚如何在Python中復制它。
我設法做到了這一點,而又沒有遍歷每一行,因為我不確定自己嘗試做的事情是否可能。 我曾經想在SAS中在組級別設置計數器或指標,並逐行修改這些指標。 例如類似
Times3Plus=0
if row['Status'] >= 3:
Times3Plus += 1
Return Times3Plus
最后,我創建了一個二進制3Plus指標
data['3Plus'] = np.where(data1['Status'] >= 3, 1, 0)
然后使用groupby總結這些內容以在組級別創建Times3Plus
data['Times3Plus'] = data.groupby(['ID'])['3Plus'].cumsum()
然后可以使用函數填充Into3
def into3(row):
if row['3Plus'] == 1 and row['Times3Plus'] == 1: #i.e it is the first time
return 1
data['Into3'] = data.apply(into3, axis = 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.