簡體   English   中英

如何根據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_MinD_Max應該相同。

謝謝你的建議。

首先更換年NaN布爾面具和S mask ,然后groupbybfill的回來填補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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM