Pandas:如何删除具有重复复合键的行,同时保持缺失值分布在重复项中?

qvtsj1bj  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(113)

预期结果

我有一个数据表,如下所示:

我想把这个表转换成这样:

问题描述

IDEvent#字段是表示表中一个唯一条目的复合键。
条目可以重复两次或更多次。但是一些行值分布在重复项之间。而且我并不总是知道那些行值是在“第一个”、“最后一个”还是一些“中间”重复项中找到的。
我想删除重复的条目,同时保留所有填充的行值,而不管它们在重复条目中的分布位置。

我该如何对待Pandas

看了一些SO的帖子,我觉得我需要使用groupbyfillnaffill/bfill。但是我是Pandas的新手,不明白在这种情况下我怎么能让它工作:
1.使用复合键区分行
1.存在多个重复行的示例
1.分布在这些重复项中的多个字段中存在有效数据
1.我并不总是知道有效的行数据是位于“第一个”、“最后一个”还是某个“中间”副本中
数据框如下:

df = pd.DataFrame([['ABC111',   1,  '1/1/23 12:00:00',  None,               '1/1/23 13:30:00',  None], 
    ['ABC111',      2,  '1/2/23 00:00:00',  None,               '1/2/23 13:30:00',  None], 
    ['ABC111',      3,  '1/3/23 00:00:00',  None,               '1/3/23 13:30:00',  None], 
    ['ABC112',      1,  '1/1/23 00:00:00',  None,               '1/1/23 13:30:00',  None], 
    ['ABC112',      2,  '1/2/23 00:00:00',  'Test Value A',     None,               None], 
    ['ABC112',      2,  '1/2/23 00:00:00',  'Test Value A',     None,               None], 
    ['ABC112',      2,  None,               None,               '1/2/23 13:30:00',  'Test Value B'], 
    ['ABC113',      1,  '1/1/23 00:00:00',  None,               '1/1/23 13:30:00',  None], 
    ['ABC113',      2,  '1/2/23 00:00:00',  None,               '1/2/23 13:30:00',  None], 
    ['ABC113',      3,  None,               None,               '1/3/23 13:30:00',  'Test Value B'], 
    ['ABC113',      3,  '1/3/23 00:00:00',  'Test Value A',     None,               None], 
    ['ABC114',      1,  '1/1/23 00:00:00',  'Test Value A',     None,               None], 
    ['ABC114',      1,  None,               None,               '1/1/23 13:30:00',  'Test Value B'], 
    ['ABC114',      1,  None,               None,               '1/1/23 13:30:00',  'Test Value B'], 
    ['ABC114',      1,  None,               None,               '1/1/23 13:30:00',  'Test Value B'], 
    ['ABC114',      1,  None,               None,               '1/1/23 13:30:00',  'Test Value B'], 
    ['ABC114',      2,  '1/2/23 00:00:00',  None,               '1/2/23 13:30:00',  None], 
    ['ABC114',      3,  '1/3/23 00:00:00',  None,               '1/3/23 13:30:00',  None]],
    columns=['ID', 'Event #', 'Start Date', 'Start Value', 'End Date', 'End Value'])

这篇文章是我能找到的最接近的潜在解决方案:Pandas: filling missing values by mean in each group

wkyowqbh

wkyowqbh1#

看起来您需要groupby.first

out = df.groupby(['ID', 'Event #'], as_index=False).first()

输出:

ID  Event #       Start Date   Start Value         End Date     End Value
0   ABC111        1  1/1/23 12:00:00          None  1/1/23 13:30:00          None
1   ABC111        2  1/2/23 00:00:00          None  1/2/23 13:30:00          None
2   ABC111        3  1/3/23 00:00:00          None  1/3/23 13:30:00          None
3   ABC112        1  1/1/23 00:00:00          None  1/1/23 13:30:00          None
4   ABC112        2  1/2/23 00:00:00  Test Value A  1/2/23 13:30:00  Test Value B
5   ABC113        1  1/1/23 00:00:00          None  1/1/23 13:30:00          None
6   ABC113        2  1/2/23 00:00:00          None  1/2/23 13:30:00          None
7   ABC113        3  1/3/23 00:00:00  Test Value A  1/3/23 13:30:00  Test Value B
8   ABC114        1  1/1/23 00:00:00  Test Value A  1/1/23 13:30:00  Test Value B
9   ABC114        2  1/2/23 00:00:00          None  1/2/23 13:30:00          None
10  ABC114        3  1/3/23 00:00:00          None  1/3/23 13:30:00          None

相关问题