我有一个看起来像这样的数据框: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)
但是,正如您从我的“翻转”栏中看到的那样,它无法识别区域内的变化。
答案 0 :(得分:1)
这是将IF (rec_list(i).emp_sal > 5000) THEN
rec_list.DELETE(i);
END IF;
与DataFrame.groupby
和DataFrame.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)