[英]how to populate a new column from conditions based on two existing columns , in Pandas?
[英]How create two columns based on existing column with conditions in Pandas?
我有这样的日期框架:
import pandas as pd
df = pd.DataFrame({'Car_ID': ['B332', 'B332', 'B332', 'C315', 'C315', 'C315', 'C315', 'C315', 'F310', 'F310'], \
'Date': ['2018-03-15', '2018', '2018-03-12', '2018', '2018-03-16', '2018', \
'2018', '2018-03-11', '2018-03-10', '2018'], \
'Driver': ['Alex', 'Alex', 'Alex', 'Sara', 'Sara', 'Sara', 'Sara', 'Sara', 'Franck','Franck']})
df
Out:
Car_ID Date Driver
0 B332 2018-03-15 Alex
1 B332 2018 Alex
2 B332 2018-03-12 Alex
3 C315 2018 Sara
4 C315 2018-03-16 Sara
5 C315 2018 Sara
6 C315 2018 Sara
7 C315 2018-03-11 Sara
8 F310 2018-03-10 Franck
9 F310 2018 Franck
哪个包含不正确的日期? 出于这个原因,我想创建两个这样的新列:
Car_ID Date D_Min D_Max Driver
0 B332 2018-03-15 2018-03-15 2018-03-15 Alex
1 B332 2018 2018-03-12 2018-03-15 Alex
2 B332 2018-03-12 2018-03-12 2018-03-12 Alex
3 C315 2018 2018-03-16 2018 Sara
4 C315 2018-03-16 2018-03-16 2018-03-16 Sara
5 C315 2018 2018-03-11 2018-03-16 Sara
6 C315 2018 2018-03-11 2018-03-16 Sara
7 C315 2018-03-11 2018-03-11 2018-03-11 Sara
8 F310 2018-03-10 2018-03-10 2018-03-10 Franck
9 F310 2018 2018 2018-03-10 Franck
对于D_Min
对于错误的日期,我想采取之前的日期是正确的。 如果之前的日期不正确,我将按原样拍摄,例如示例9 F310 2018 2018 2018-03-10 Franck
。 我想为D_Max
做同样的D_Max
。 但如果日期正确,则D_Min
和D_Max
应该相同。
谢谢你的建议。
首先更换年NaN
布尔面具和S mask
,然后groupby
与bfill
的回来填补ffill
正向充填,最后更换NaN
S按fillna
:
#only years are numeric
mask = df['Date'].str.isnumeric()
#alternative mask -check length of string
#mask = df['Date'].str.len() == 4
#not numeric return NaNs, so test non NaNs
#mask = pd.to_numeric(df['Date'], errors='coerce').notna()
s = df['Date'].mask(mask)
g = s.groupby(df['Driver'])
df['D_Min'] = g.bfill().fillna(df['Date'])
df['D_Max'] = g.ffill().fillna(df['Date'])
print (df)
Car_ID Date Driver D_Min D_Max
0 B332 2018-03-15 Alex 2018-03-15 2018-03-15
1 B332 2018 Alex 2018-03-12 2018-03-15
2 B332 2018-03-12 Alex 2018-03-12 2018-03-12
3 C315 2018 Sara 2018-03-16 2018
4 C315 2018-03-16 Sara 2018-03-16 2018-03-16
5 C315 2018 Sara 2018-03-11 2018-03-16
6 C315 2018 Sara 2018-03-11 2018-03-16
7 C315 2018-03-11 Sara 2018-03-11 2018-03-11
8 F310 2018-03-10 Franck 2018-03-10 2018-03-10
9 F310 2018 Franck 2018 2018-03-10
细节 :
print (s)
0 2018-03-15
1 NaN
2 2018-03-12
3 NaN
4 2018-03-16
5 NaN
6 NaN
7 2018-03-11
8 2018-03-10
9 NaN
Name: Date, dtype: object
df_grpd = df.groupby('Car_ID').agg({'Date': [sorted, min, max]})
print df_grpd
Date
sorted min max
Car_ID
B332 [2018, 2018-03-12, 2018-03-15] 2018 2018-03-15
C315 [2018, 2018, 2018, 2018-03-11, 2018-03-16] 2018 2018-03-16
F310 [2018, 2018-03-10] 2018 2018-03-10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.