【发布时间】:2020-01-03 04:36:48
【问题描述】:
我有一个可以表示如下的 Pandas 数据框:
df = pd.DataFrame({'id':[1,2,3,4],
'gp':['a','a','b','b'],
'meta':['one','two','three','four'],
'matchvar':['wwww','w ww w','xxxx','xyxx'],
'match':[np.nan,'yes',np.nan,'no']})
...看起来像:
id gp meta matchvar match
0 1 a one wwww NaN
1 2 a two w ww w yes
2 3 b three xxxx NaN
3 4 b four xyxx no
可以使用 groupby 将数据分组到 'gp' 列:
for g in df.groupby(['gp']):
print(g[1])
id gp meta matchvar match
0 1 a one wwww NaN
1 2 a two w ww w yes
id gp meta matchvar match
2 3 b three xxxx NaN
3 4 b four xyxx no
如果组中的最后一行数据在“匹配”列中包含“是”,我只想保留最后一行数据,但“id”列需要使用前一行的值进行更新.
如果组中的最后一行数据在“匹配”列中包含“否”,则需要保留两行而不进行任何更改。
这可以概括为:
id gp meta matchvar match
0 1 a one wwww NaN --> [row discarded]
1 2 a two w ww w yes --> 1 1 a two w ww w yes [N.B. id from previous row]
...和:
id gp meta matchvar match
2 3 b three xxxx NaN --> 2 3 b three xxxx NaN
3 4 b four xyxx no --> 3 4 b four xyxx no
因此,预期的输出应该是具有以下结构的数据框:
id gp meta matchvar match
1 1 a two w ww w yes
2 3 b three xxxx NaN
3 4 b four xyxx no
我可以使用 .last() 保留组的最后一行,但我不知道如何维护前一行的“id”值。
如有任何建议,我们将不胜感激。
【问题讨论】:
-
yes和no列中的no值是否只出现在最后一行? -
每个组最多只包含 2 行,最后(或第二)行包含 'yes' 和 'no' 值。
-
有没有一组只有一行的情况?
-
有些组可能只有一行,但如有必要,我可以事先过滤掉。
-
在这种情况下,只需将
yes组与no组分开即可。处理yes的id以获取前一行值并返回concat它们。我使用这个逻辑发布了一个解决方案