仅在相同索引值内识别列值的变化

时间:2018-10-03 14:39:48

标签: python pandas

我有一个看起来像这样的数据框:https://github.com/thedatasleuth/New-York-Congressional-Districts/blob/master/newyork_total2.csv

我想创建一个名为“翻转”的列,该列将跟踪“ DOMINANT_PARTY”列中各年度 内的政党变化。例如,从2015年到2016年,第19区从REP转变为DEM。这就是我要跟踪的“变化”。但是,我不想跟踪各区之间的变化-例如,我不在乎第1区和第2区之间从REP到DEM的变化。到目前为止,我已经编写了以下代码:

for index, row in newyork_total2.iterrows():
    newyork_total2['Flipped'] = newyork_total2['DOMINANT_PARTY'].ne(newyork_total2['DOMINANT_PARTY'].shift().bfill()).astype(int)

但是,正如您从我的“翻转”栏中看到的那样,它无法识别区域内的变化。

2 个答案:

答案 0 :(得分:1)

这是将IF (rec_list(i).emp_sal > 5000) THEN rec_list.DELETE(i); END IF; DataFrame.groupbyDataFrame.apply结合使用的一种方法:

lambda

更新-说明

此处的f = lambda x: (x.ne(x.shift()) & x.shift().notna()).astype(int) df['Flipped'] = df.groupby('DISTRICT')['DOMINANT_PARTY'].apply(f).values 是该函数的简写

lambda

该函数采用def flipped(x): return x.ne(x.shift()) & x.shift().notna() -在这种情况下为Series

让我们看一下有“翻转”解释的区域(第19区):

['DOMINANT_PARTY']

在这里,我们应用功能的 DISTRICT Year DOMINANT_PARTY ... 90 19 2014 REP ... 91 19 2015 REP ... 92 19 2016 DEM ... 93 19 2017 DEM ... 94 19 2018 DEM ... 是系列:

x

90 REP 91 REP 92 DEM 93 DEM 94 DEM 是:

x.shift()

函数90 NaN 91 REP 92 REP 93 DEM 94 DEM 中的第一个逻辑表达式将这些Series与Series.ne方法(不相等)进行比较,该方法为:

f

请注意我们如何有2个90 REP != NaN True 91 REP != REP False 92 DEM != REP True 93 DEM != DEM False 94 DEM != DEM False 值,因为第一行-“ REP”确实不等于NaN。 这就是为什么我们有第二个逻辑表达式来满足True不等于x.shift()NaN)的原因。 x.shift().notna()运算符是逻辑AND语句,要求同时满足这两个条件。

&

答案 1 :(得分:0)

您可以使用groupby.transform

def find_flip(group):
    return (group.shift(1).notna() & (group != group.shift(1)))

此函数计算系列中是否有翻页

df["FLIPPED"] = df.groupby("DISTRICT")['DOMINANT_PARTY'].transform(find_flip)