仅在相同索引值内标识列值的更改

2024-10-03 04:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:https://github.com/thedatasleuth/New-York-Congressional-Districts/blob/master/newyork_total2.csv

我想创建一个名为“翻转”的专栏,跟踪“主导党”专栏中地区内政党的变化。例如,从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)

但正如你从我的“翻页”专栏中看到的,它并没有认识到地区内部的变化


Tags: 数据httpsgithubcomnewparty地区dominant
2条回答

您可以使用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)

下面是一种使用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—在本例中为['DOMINANT_PARTY']

让我们看看有“翻转”需要解释的地区(地区19):

    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

函数f中的第一个逻辑表达式将这些序列与^{}方法(不相等)进行比较,后者是:

90    REP   !=   NaN    True
91    REP   !=   REP    False
92    DEM   !=   REP    True
93    DEM   !=   DEM    False
94    DEM   !=   DEM    False

注意我们有2True个值,因为第一行-'REP'确实不等于NaN。 这就是为什么我们有第二个逻辑表达式来满足x.shift()不等于NaNx.shift().notna())。 &运算符是逻辑AND语句,要求同时满足这两个条件

90    REP   !=   NaN    False
91    REP   !=   REP    False
92    DEM   !=   REP    True
93    DEM   !=   DEM    False
94    DEM   !=   DEM    False

相关问题 更多 >