使用groupby函数根据唯一条件从不同的列中选择不同的值

时间:2019-05-08 03:46:57

标签: python pandas

我有一个这样的数据框:

PA  date    grade_conc  grade_rebar grade_mason grade_work  grade_timber    grade_steel grade_total
0   1   2018-10-13  A   NR  NR  NR  A   A   NR
1   1   2018-10-14  A   NR  NR  NR  A   Z   NR
2   1   2018-10-15  A   NR  NR  NR  B   U   NR
3   2   2018-10-13  B   NR  NR  NR  B   B   NR
4   2   2018-10-14  Z   NR  NR  NR  A   B   NR
5   2   2018-10-15  U   NR  NR  NR  B   A   NR

我希望结果为


   PA     date     grade_conc   grade_rebar grade_mason grade_work  grade_timber    grade_steel grade_total
    1   2018-10-15  A   NR  NR  NR  B   Z   NR
    2   2018-10-15  Z   NR  NR  NR  B   A   NR

结果应按PA列分组,并为所有列选择最新的日期值,除非列的值为“ U”,在这种情况下,应为较早的日期值,其中仅该列没有“ U”

3 个答案:

答案 0 :(得分:2)

replace'U'与NaN,那么您需要groupby + last的逻辑:

#df = df.sort_values(['PA', 'date'])
df.replace('U', np.NaN).groupby('PA').last()

          date grade_conc grade_rebar grade_mason grade_work grade_timber grade_steel grade_total
PA                                                                                               
1   2018-10-15          A          NR          NR         NR            B           Z          NR
2   2018-10-15          Z          NR          NR         NR            B           A          NR

答案 1 :(得分:2)

我将ffilltail一起使用

df = df.sort_values(['date'])
df=df.mask(df=='U')
df.groupby('PA').ffill().groupby('PA').tail(1)
Out[277]: 
   PA        date grade_conc     ...     grade_timber grade_steel grade_total
2   1  2018-10-15          A     ...                B           Z          NR
5   2  2018-10-15          Z     ...                B           A          NR
[2 rows x 9 columns]

drop_duplicates

df.groupby('PA').ffill().drop_duplicates('PA',keep='last')

答案 2 :(得分:0)

也许使用groupbyapplyreplaceffill,最后使用tail

print(df.groupby('PA', as_index=False).apply(lambda x: x.replace('U',np.nan).ffill().tail(1)))

输出:

     PA        date grade_conc grade_rebar grade_mason grade_work  \
0 2   1  2018-10-15          A          NR          NR         NR   
1 5   2  2018-10-15          Z          NR          NR         NR   

    grade_timber grade_steel grade_total  
0 2            B           Z          NR  
1 5            B           A          NR