pandas 循环panda Dataframe 以创建虚拟 Dataframe

1rhkuytd  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(177)

我有一个数据集,看起来如下-

|      year     |     state   | election year 1-yes|
|---------------|-------------|--------------------|
|          2010 |     haryana |          1         | 
|          2010 |     haryana |          1         | 
|          2010 |     up      |          0         | 
|          2011 |     goa     |          1         |
|          2012 |     haryana |          0         | 
|          2012 |     up      |          1         | 
|          2013 |     up      |          0         |
|          2013 |     up      |          0         |
|          2013 |     haryana |          1         |
|          2015 |     haryana |          0         |
|          2015 |     up      |          0         |

哈里亚纳邦在2010年有选举,所以是1,但是果阿邦及以上的邦在2010年没有选举,所以选举年是0。
我想要一个循环,它可以添加另一个列,告诉到下次选举的年数。所以,当哈里亚纳邦在2010年举行选举时,它将是0(因为选举只安排在今年),而在2012年,它将是3,因为下次选举是在2015年。所以,所需的列有一个范围从0到4的所有国家。
下表总结了我期望的输出。

| year |  state | election year 1-yes| years until next election|
|------|--------|--------------------|--------------------------|
| 2010 |haryana |          1         |            0             |
| 2010 |haryana |          1         |            0             |
| 2010 |  up    |          0         |            2             | 
| 2011 | goa    |          1         |            0             | 
| 2012 |haryana |          0         |            3             | 
| 2012 |  up    |          1         |            0             |
| 2013 |  up    |          0         |            4             | 
| 2013 |  up    |          0         |            4             |
| 2013 |haryana |          0         |            2             |
| 2015 |haryana |          1         |            0             |
| 2015 |  up    |          0         |            2             |

我正在寻找一个简单的代码循环的年份和国家,因为我的数据有超过30个国家和12年。

tp5buhyn

tp5buhyn1#

示例

data = [[2010, 'haryana', 1], [2010, 'haryana', 1], [2010, 'up', 0],
        [2011, 'goa', 1], [2012, 'haryana', 0], [2012, 'up', 1],
        [2013, 'up', 0], [2013, 'up', 0], [2013, 'haryana', 0],
        [2015, 'haryana', 1], [2015, 'up', 0]]
df = pd.DataFrame(data, columns=['year', 'state', 'election'])

df

year    state   election
0   2010    haryana 1
1   2010    haryana 1
2   2010    up      0
3   2011    goa     1
4   2012    haryana 0
5   2012    up      1
6   2013    up      0
7   2013    up      0
8   2013    haryana 0
9   2015    haryana 1
10  2015    up      0

代码

df1 = df.drop_duplicates().copy()
cond1 = df1['election'].eq(0)
s = (df1['election'].mask(cond1).mask(~cond1, df['year'])
     .groupby(df1['state']).bfill())
df1['next'] = s.mask(~cond1, 0).mask(cond1, s.sub(df1['year']))

df1

year    state   election    next
0   2010    haryana 1           0.0
2   2010    up      0           2.0
3   2011    goa     1           0.0
4   2012    haryana 0           3.0
5   2012    up      1           0.0
6   2013    up      0           NaN
8   2013    haryana 0           2.0
9   2015    haryana 1           0.0
10  2015    up      0           NaN

合并df和df1

df.merge(df1, how='left')

实验结果:

year    state   election    next
0   2010    haryana 1           0.0
1   2010    haryana 1           0.0
2   2010    up      0           2.0
3   2011    goa     1           0.0
4   2012    haryana 0           3.0
5   2012    up      1           0.0
6   2013    up      0           NaN
7   2013    up      0           NaN
8   2013    haryana 0           2.0
9   2015    haryana 1           0.0
10  2015    up      0           NaN

相关问题