我对熊猫很陌生,我得到了一些员工的数据,这些数据有日期、月份和年份的开始和结束日期,基本上是一个有列表的列。以下是我的数据格式,如下从csv列中提取的。
data =[
{
"starts_at":{
"day":1,
"month":8,
"year":2021
},
"ends_at":None
},
{
"starts_at":{
"day":1,
"month":9,
"year":2020
},
"ends_at":{
"day":30,
"month":4,
"year":2021
}
},
{
"starts_at":None,
"ends_at":{
"day":30,
"month":4,
"year":2021
}
}
]
基本上,如果ends_at
是None
,则用户当前正在工作(正在进行(,并且如果指定了结束日期,则用户已经结束了与公司的合同。
有一些故障数据,比如start_date
是None,end_date
有日期,这些也是我考虑过的,但都是用python的方式。
我被告知要用熊猫的方式来做,但我认为我错过了熊猫的技术,而不是在n*2的时间复杂性中使用双循环。
以下是我如何用蟒蛇般的方式弄脏我的手
from datetime import datetime
from datetime import date
from dateutil import relativedelta as rdelta
today = date.today()
df =pd.read_csv('/home/navaraj/Downloads/profile-details.csv')
pd.set_option('display.max_colwidth', None)
df["experiences"] = df["experiences"].apply(eval)
print(df['experiences'])
for k in df["experiences"]:
for x in k:
starts=(x.get('starts_at'))
if starts is not None:
ends=(x.get('ends_at'))
end_date_day=end_date_month=end_date_year=None
status=None
if ends is None:
ends=today
status="On going"
else:
end_date_day=ends['day']
end_date_month=ends['month']
end_date_year=ends['year']
ends=datetime.strptime(f'{end_date_year}-{end_date_month}-{end_date_day}', '%Y-%m-%d').date()
status="ended"
starts_day=starts['day']
starts_month=starts['month']
starts_year=starts['year']
started=datetime.strptime(f'{starts_year}-{starts_month}-{starts_day}', '%Y-%m-%d').date()
rd = rdelta.relativedelta(ends,started)
result="{0.years} years and {0.months} months".format(rd)
print(result,status)
问题和期望:我只是想把最后一行数据,即result
和正在工作的status
(正在进行或已结束(附加在当前csv文件的末尾,对于我正在工作的每个用户来说,任何帮助都会非常棒。
假设"attached at the end"的意思是在每行的末尾,定义一个函数用于调用pd.apply
是避免在df上显式循环的一种方法。
以下是"状态",但"结果"也可以这样做
功能
def determine_status(row: pd.Series) -> str:
if row['starts_at']:
if row['ends_at']:
return "ended"
return "On going"
通过此调用应用于df,设置一个等于结果的新列
df.loc[:,'status'] = df.apply(determine_status, axis=1)
输出
starts_at ends_at status
0 {'day': 1, 'month': 8, 'year': 2021} None On going
1 {'day': 1, 'month': 9, 'year': 2020} {'day': 30, 'month': 4, 'year': 2021} ended
2 None {'day': 30, 'month': 4, 'year': 2021} None