我是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中复制此问题。
答案 0 :(得分:1)
我设法做到这一点而没有遍历每一行,因为我不确定我想要做什么是可能的。我本来想在组级别设置计数器或指示器,这在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()
然后可以使用函数
填充Into3def 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)