Python 获取行以增加分组数据帧中每个组中列的值

Python 获取行以增加分组数据帧中每个组中列的值,python,pandas,dataframe,data-science,Python,Pandas,Dataframe,Data Science,我的数据帧df是: data = {'Election Year':['2000', '2000','2000','2000','2000','2000','2000','2000','2000','2005','2005','2005','2005','2005','2005','2005','2005','2005', '2010', '2010','2010','2010','2010','2010','2010','2010', '2010'], 'Votes':[30, 50,

我的数据帧
df
是:

data = {'Election Year':['2000', '2000','2000','2000','2000','2000','2000','2000','2000','2005','2005','2005','2005','2005','2005','2005','2005','2005', '2010', '2010','2010','2010','2010','2010','2010','2010', '2010'],
    'Votes':[30, 50, 20, 26, 30, 45, 20, 46, 80, 60, 46, 95, 60, 10, 95, 16, 65, 35, 50, 100, 70, 26, 180, 100, 120, 46, 80], 
    'Party': ['A', 'B', 'C', 'A', 'B', 'C','A', 'B', 'C','A', 'B', 'C','A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C','A', 'B', 'C','A', 'B', 'C'],
    'Region': ['a', 'a', 'a', 'b', 'b', 'b','c', 'c', 'c','a', 'a', 'a', 'b', 'b', 'b','c', 'c', 'c','a', 'a', 'a', 'b', 'b', 'b','c', 'c', 'c']}
df = pd.DataFrame(data)
df

    
    Election Year   Votes   Party   Region
  0   2000           30      A       a
  1   2000           50      B       a
  2   2000           20      C       a
  3   2000           26      A       b
  4   2000           30      B       b
  5   2000           45      C       b 
  6   2000           20      A       c
  7   2000           46      B       c
  8   2000           80      C       c
  9   2005           60      A       a
  10  2005           66      B       a
  11  2005           95      C       a
  12  2005           60      A       b
  13  2005           10      B       b
  14  2005           95      C       b
  15  2005           16      A       c
  16  2005           65      B       c
  17  2005           35      C       c
  18  2010           50      A       a
  19  2010           100     B       a
  20  2010           70      C       a
  21  2010           26      A       b
  22  2010           180     B       b
  23  2010           100     C       b 
  24  2010           120     A       c
  25  2010           46      B       c
  26  2010           80      C       c
我想谈谈2000年前两大政党(就获得最高总票数而言)在接下来的两次选举中不断增加选票的地区。。 因此,期望的输出是:

   Party   Region
     B        a
     B        c
     C        b
首先,我试图根据2000年的总票数选出前两个政党。这是给当事人“C”和“B”的

这就给了当事人“C”和“B”

现在,我如何检查这些政党的选票在随后几年中增加的地区?

  • 首先在2010年建立两个得票最高的政党
  • 然后,在未来几年中,分析政党/地区组合的上升投票数和总投票数
  • 最后选出符合标准的政党/地区配对
  • 我所看到的这个逻辑是有效的,但给你的输出不同
输出 区域 聚会 提升 投票 0 A. B 真的 146 1. B C 真的 195 2. C C 真的 115
我喜欢Rob Raymond的答案,但我只想强调一些可能对解决此类问题有用的东西。对于这种分析,最好查看以“Party”和“Region”列作为索引的数据

如果我们这样做

grps=[“Party”,“Region”]#我这样做是因为我们以后会用到这些
df=df.set_index(grps).sort_index()
然后
df
现在看起来

             Election Year  Votes
Party Region
A     a               2000     30
      a               2005     60
      a               2010     50
      b               2000     26
      b               2005     60
      b               2010     26
      c               2000     20
      c               2005     16
      c               2010    120
B     a               2000     50
      a               2005     46
      a               2010    100
      b               2000     30
      b               2005     10
      b               2010    180
      c               2000     46
      c               2005     65
      c               2010     46
C     a               2000     20
      a               2005     95
      a               2010     70
      b               2000     45
      b               2005     95
      b               2010    100
      c               2000     80
      c               2005     35
      c               2010     80
我认为这更容易通过肉眼进行交叉检查。例如,根据我对你问题的理解,投票数每年增加的唯一政党/地区是“C/b”,2000年有45票,2005年有95票,2010年有100票

但是,如果数据太大而无法查看该怎么办呢。然后我们可以按新的索引分组(记住现在是“Party”和“Region”),并将
diff
方法应用于“vows”列。我们将把结果分配回一个名为“投票差异”的新列

df[“投票差异”]=df.groupby(grps)[“投票差异”].Diff()
现在
df

             Election Year  Votes  Vote Diff
Party Region
A     a               2000     30        NaN
      a               2005     60       30.0
      a               2010     50      -10.0
      b               2000     26        NaN
      b               2005     60       34.0
      b               2010     26      -34.0
      c               2000     20        NaN
      c               2005     16       -4.0
      c               2010    120      104.0
B     a               2000     50        NaN
      a               2005     46       -4.0
      a               2010    100       54.0
      b               2000     30        NaN
      b               2005     10      -20.0
      b               2010    180      170.0
      c               2000     46        NaN
      c               2005     65       19.0
      c               2010     46      -19.0
C     a               2000     20        NaN
      a               2005     95       75.0
      a               2010     70      -25.0
      b               2000     45        NaN
      b               2005     95       50.0
      b               2010    100        5.0
      c               2000     80        NaN
      c               2005     35      -45.0
      c               2010     80       45.0
现在我们可以很容易地看到投票的起起落落。对于您想要做的事情,我们现在不太关心2000年,因此我们可以在下一部分中使用
drona
安全地删除带有
NaN
的行

我们现在需要过滤政党/地区的群体,只保留群体中所有“投票差异”值均为正值的群体(即每年增加的投票)。我们可以在
groupby
对象上使用
filter
。我们需要一个小函数来测试这是否正确,这里我使用了一个
lambda
,但您也可以定义它

out=df.dropna()
给予

瞧!我们看到,C方/b区是唯一一个票数同比增加的政党

我们没有考虑如何将其与您的顶级政党需求相结合,但是您有一个顶级政党列表,这是直接的(对您的
top_2
代码进行了轻微修改)

top_2=(df[df[“选举年”]=“2000”]
.groupby(“一方”)[“投票数”].sum()
.NLAGEST(2))
out.loc[顶部索引]
把它们放在一起
top_2=(df[df[“选举年”]=“2000”]
.groupby(“一方”)[“投票数”].sum()
.NLAGEST(2))
grps=[“缔约方”、“地区”]
df=df.set_index(grps).sort_index()
df[“投票差异”]=df.groupby(GRP)[“投票差异”].Diff()
df.dropna().groupby(grps).filter(lambda x:(x[“投票差异”]>0).all()).loc[顶部2.索引]

感谢您的时间和回答。能用更简单的方法解决吗?我被这件事弄得不知所措。我已经更新了groupby/aggregate阶段,以提供更高的透明度,以找到投票率增加的组合。使用我的方法,您将无法获得Region
c
,因为它的投票率低于2000年的投票率,那么就可以了。我在输出中犯了错误。请加入此讨论
             Election Year  Votes
Party Region
A     a               2000     30
      a               2005     60
      a               2010     50
      b               2000     26
      b               2005     60
      b               2010     26
      c               2000     20
      c               2005     16
      c               2010    120
B     a               2000     50
      a               2005     46
      a               2010    100
      b               2000     30
      b               2005     10
      b               2010    180
      c               2000     46
      c               2005     65
      c               2010     46
C     a               2000     20
      a               2005     95
      a               2010     70
      b               2000     45
      b               2005     95
      b               2010    100
      c               2000     80
      c               2005     35
      c               2010     80
             Election Year  Votes  Vote Diff
Party Region
A     a               2000     30        NaN
      a               2005     60       30.0
      a               2010     50      -10.0
      b               2000     26        NaN
      b               2005     60       34.0
      b               2010     26      -34.0
      c               2000     20        NaN
      c               2005     16       -4.0
      c               2010    120      104.0
B     a               2000     50        NaN
      a               2005     46       -4.0
      a               2010    100       54.0
      b               2000     30        NaN
      b               2005     10      -20.0
      b               2010    180      170.0
      c               2000     46        NaN
      c               2005     65       19.0
      c               2010     46      -19.0
C     a               2000     20        NaN
      a               2005     95       75.0
      a               2010     70      -25.0
      b               2000     45        NaN
      b               2005     95       50.0
      b               2010    100        5.0
      c               2000     80        NaN
      c               2005     35      -45.0
      c               2010     80       45.0
             Election Year  Votes  Vote Diff
Party Region
C     b               2005     95       50.0
      b               2010    100        5.0