【问题标题】:Find missing numbers in a sorted column in Pandas Dataframe在 Pandas Dataframe 的排序列中查找缺失的数字
【发布时间】:2021-05-25 03:04:21
【问题描述】:

我在下面有这个数据框,我想检测每个主题的缺失访问,如何按主题对访问进行排序并仅提取具有缺失值的记录?请检查所需的两种类型的输出。

第 1 部分:因此,根据“访问”列中所有主题的最高数字,所有主题的缺失记录需要显示:

    Subject  Visit      X1      X2
       A       1    1647143  1672244
       A       2    1672244  1689707
       A       4    1689707  1713090
       B       1    1735352  1760283
       B       2    1760283  1788062
       B       7    1788062  1789885
       B       9    1789885  1790728

输出将是:

    Subject  Visit      X1      X2
       A       3    1647143  1672244
       A       5    1672244  1689707
       A       6    1689707  1713090
       A       7    1647143  1672244
       A       8    1672244  1689707
       A       9    1689707  1713090
       B       3    1735352  1760283
       B       4    1760283  1788062
       B       5    1788062  1789885
       B       6    1789885  1790728
       B       8    1789885  1790728

第 2 部分:因此,取决于访问序列中每个特定主题缺失记录的“访问”列中的最高数字,需要显示: 示例输出:

    Subject  Visit      X1      X2
       A       3    1647143  1672244
       B       3    1735352  1760283
       B       4    1760283  1788062
       B       5    1788062  1789885
       B       6    1789885  1790728
       B       8    1789885  1790728

【问题讨论】:

  • 您能否分享上述数据框的示例输出
  • @Devarshi Mandal 请看一下,我刚刚做了
  • 在结果中填写 X1 和 X2 有什么要求?
  • 不用看X1和X2 Jorge
  • 创建缺失行时,行数据和 X1 和 X2 来自哪里?

标签: python r pandas dataframe tidyverse


【解决方案1】:

您找到每个主题的缺失访问,其中每个主题的最大访问是 Visit 列的最大值,您可以创建所有可能的 (subject, visit) 对的集合,然后区分观察到的对。

from itertools import product

all_pairs = set(product(sorted(set(df.Subject)), range(1, df.Visit.max()+1)))
observed_pairs = set(tuple(x) for x in df[['Subject', 'Visit']].to_numpy())

# create a data frame from the missing pairs
pd.DataFrame(sorted(all_pairs.difference(observed_pairs)), columns=['Subject', 'Visit'])
# returns:
   Subject  Visit
0        A      3
1        A      5
2        A      6
3        A      7
4        A      8
5        A      9
6        B      3
7        B      4
8        B      5
9        B      6
10       B      8

在每个主题的最大访问范围内查找丢失的访问。您可以执行以下操作:

def missing_visits(s):
    all_v = set(range(1, s.max()+1))
    obs_v = set(s)
    return sorted(all_v.difference(obs_v))


df.groupby('Subject')['Visit'].apply(missing_visits).explode()
# returns:
Subject
A    3
B    3
B    4
B    5
B    6
B    8

【讨论】:

  • 主题不仅是 A 和 B,您的代码中的结果数据框仅显示 A 和 B 主题
【解决方案2】:
 #Use the min, max in the visit column for each group to reindex df and fillna
    g=df.groupby('Subject',group_keys=False).apply(lambda x:x.reindex(np.arange(x['Visit'].min(),x['Visit'].max())).ffill().bfill())

#Update the visit column
g['Visit']=g.index

print(g)
# First outcome



Subject  Visit         X1         X2
1       A      1  1672244.0  1689707.0
2       A      2  1689707.0  1713090.0
3       A      3  1689707.0  1713090.0
1       B      1  1735352.0  1760283.0
2       B      2  1735352.0  1760283.0
3       B      3  1735352.0  1760283.0
4       B      4  1760283.0  1788062.0
5       B      5  1788062.0  1789885.0
6       B      6  1789885.0  1790728.0
7       B      7  1789885.0  1790728.0
8       B      8  1789885.0  1790728.0


#Filtered outcome

    #Create and compare tuples of ['Subject','Visit'] of the original and new dataframes
g[~g[['Subject','Visit']].agg(tuple,1).isin(df[['Subject','Visit']].agg(tuple,1))]



    Subject  Visit    X1         X2
3       A      3  1689707.0  1713090.0
3       B      3  1735352.0  1760283.0
4       B      4  1760283.0  1788062.0
5       B      5  1788062.0  1789885.0
6       B      6  1789885.0  1790728.0
8       B      8  1789885.0  1790728.0

【讨论】:

  • @Shahine Greene,这有帮助吗?很高兴能提供进一步的帮助
【解决方案3】:

这里是R 中的data.table 选项

  • 第 1 部分
> setDT(df)[, .(Visit = setdiff(seq(max(df[, "Visit"])), Visit)), Subject]
    Subject Visit
 1:       A     3
 2:       A     5
 3:       A     6
 4:       A     7
 5:       A     8
 6:       A     9
 7:       B     3
 8:       B     4
 9:       B     5
10:       B     6
11:       B     8
  • 第二部分
> setDT(df)[, .(Visit = setdiff(seq(max(Visit)), Visit)), Subject]
   Subject Visit
1:       A     3
2:       B     3
3:       B     4
4:       B     5
5:       B     6
6:       B     8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2021-06-23
    • 2012-07-08
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多