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年建立两个得票最高的政党
- 然后,在未来几年中,分析政党/地区组合的上升投票数和总投票数
- 最后选出符合标准的政党/地区配对
- 我所看到的这个逻辑是有效的,但给你的输出不同
我喜欢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阶段,以提供更高的透明度,以找到投票率增加的组合。使用我的方法,您将无法获得Regionc
,因为它的投票率低于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