我有一个这样的数据框:
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”
答案 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)
我将ffill
与tail
一起使用
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)
也许使用groupby
,apply
,replace
,ffill
,最后使用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