pandas 根据两个条件添加新列

rsl1atfo  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(119)

下面是一个例子:
| 国家/地区|年份|日期|
| - -|- -|- -|
| 西班牙Name|小行星2020| 2020年8月10日|
| 德国|小行星2020| 2020年8月10日|
| 意大利|二〇一九年|2020年8月11日|
| 西班牙Name|二〇一九年|2020年8月20日|
| 西班牙Name|小行星2020| 2020年6月10日|
我想添加一个新列,如果是某个国家一年中的第一天,则给出1,如果不是第一天,则给出0。
我试着写一个函数,但我意识到它实际上没有意义。

def first_date(x, country, year):
    if df["date"] == df[(df["country"] == country) & (df["year"] == year)]["date"].min():
        x==1
    else: 
        x==0

`

py49o6xq

py49o6xq1#

有很多方法可以实现这一点。让我们创建一个groupby对象来获取每个国家的最小索引,这样我们就可以使用.loc进行一些赋值
顺便说一句,将if与panda一起使用通常是一种反模式--panda中有一些原生函数,可以帮助您在利用引擎盖下的矢量化代码库的同时实现同样的功能。
推荐阅读:https://pandas.pydata.org/docs/user_guide/10min.html

df.loc[df.groupby(['Country'])['Date'].idxmin(), 'x'] = 1

df['x'] = df['x'].fillna(0)

   Country  Year       Date    x
0    Spain  2020 2020-08-10  0.0
1  Germany  2020 2020-08-10  1.0
2    Italy  2019 2020-08-11  1.0
3    Spain  2019 2020-08-20  0.0
4    Spain  2020 2020-06-10  1.0

或将np.wheredf.index.isin结合使用

import numpy as np 

df['x'] = np.where(
       df.index.isin(df.groupby(['Country'])['Date'].transform('idxmin')),1,0)

相关问题