从不包括所有可能的组合和缺失值的数据创建计数表在数据框架中可用

2024-04-23 20:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地从df1中的数据创建了一个计数表

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
'B':['yes','no','no','no','yes','yes','no','yes','yes','no'],
'C':['no','yes','yes','no','yes','no','no','no','yes','no']})

通过使用以下命令:

df1.groupby(['A','B','C']).size().reset_index().rename(columns={0:'count'})

我得到了如下的计数表:

--+--+--+--+--+--+--+--+--+--+--+
index    A     B    C    count
0       no    no   no        1
1       no   yes   no        1
2       no   yes  yes        1
3      yes    no   no        2
4      yes    no  yes        2
5      yes   yes   no        2
6      yes   yes  yes        1
--+--+--+--+--+--+--+--+--+--+--+

然而,A,B,C的可能值是{yes','no},这意味着所有可能的 组合应等于2*2*2=8。我无法尽可能得到确切的答案 因为我的数据不包括所有的情况。预期输出应 具体如下:

--+--+--+--+--+--+--+--+--+--+--+
index    A     B    C    count
0       no    no   no        1
1       no   yes   no        1
2       no    no  yes        0    <-- count = 0 because it does not exist in my data
3       no   yes  yes        1
4      yes    no   no        2
5      yes    no  yes        2
6      yes   yes   no        2
7      yes   yes  yes        1
--+--+--+--+--+--+--+--+--+--+--+

此外,我的数据中可能缺少值。例如,具有 缺少的值是以下代码:

df2 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','*','no'],
'B':['yes','*','no','no','yes','yes','no','yes','yes','no'],
'C':['no','yes','*','no','yes','no','no','no','yes','no']})

因此,我的数据(缺少值)如下所示

--+--+--+--+--+--+--+--+
index    A     B    C
0      yes   yes   no
1      yes     *  yes
2      yes    no    *
3      yes    no   no
4       no   yes  yes
5       no   yes   no
6      yes    no   no
7      yes   yes   no
8        *   yes  yes
9       no    no   no
--+--+--+--+--+--+--+--+

其中*表示缺少的值。在这种情况下,我仍然希望创建我的计数表 包含所有可能的情况(类似于第二个表)。在这种情况下,我需要忽略 至少缺少一个值(索引=1、2和8)的任何行。因此, 预期的输出应该是这样的。你知道吗

--+--+--+--+--+--+--+--+--+--+--+
index    A     B    C    count
0       no    no   no        1
1       no   yes   no        1
2       no    no  yes        0   <-- count = 0 because it does not exist in my data
3       no   yes  yes        1
4      yes    no   no        2
5      yes    no  yes        0   <-- count = 0 because of missing value in row 2
6      yes   yes   no        2
7      yes   yes  yes        0   <-- count = 0 because of missing value in row 1 and 8
--+--+--+--+--+--+--+--+--+--+--+

你能给我一些建议吗?如何克服保险范围问题和价值缺失问题? 先谢谢你。你知道吗


Tags: 数据noindataframeindexcountnot情况
2条回答

让我先回答你的保险问题。你知道吗

第一步是生成具有所有可能性的数据帧。为此,我从笛卡尔积创建了一个多索引,并重置了索引(就像您所做的那样):

iterables = [['yes', 'no'], ['yes', 'no'], ['yes', 'no']]
df_all = pd.DataFrame(
        {'count': 0}, 
        index=pd.MultiIndex.from_product(iterables, names=['A', 'B', 'C'])
    ).reset_index()

第二步使用combine_first将结果与分组的数据帧(我在下面称之为df)相结合。问题是combine_first是按索引工作的,所以我必须首先重新索引这两个数据帧。你知道吗

我找到的最简单(如果不是最优雅的)解决方案是将列ABC的串联设置为索引:

df = df1.groupby(['A','B','C']).size().reset_index().rename(columns={0:'count'})
df.set_index(df['A'] + df['B'] + df['C'], inplace=True)

现在我们可以使用combine_first,将临时索引放在末尾:

df_all.set_index(df_all['A'] + df_all['B'] + df_all['C'], inplace=True)
df.combine_first(df_all).reset_index(drop=True)

结果是:

     A    B    C  count
0   no   no   no      1
1   no   no  yes      0
2   no  yes   no      1
3   no  yes  yes      1
4  yes   no   no      2
5  yes   no  yes      2
6  yes  yes   no      2
7  yes  yes  yes      1

在获得groupby的大小之后,可以添加一个reindex

In [1]: idx = pd.MultiIndex.from_product([['no', 'yes']] * 3, names=['A', 'B', 'C'])

In [2]: print df1.groupby(['A', 'B', 'C']).size().reindex(idx).fillna(0).reset_index().rename(columns={0: 'count'})
     A    B    C  count
0   no   no   no      1
1   no   no  yes      0
2   no  yes   no      1
3   no  yes  yes      1
4  yes   no   no      2
5  yes   no  yes      2
6  yes  yes   no      2
7  yes  yes  yes      1

In [3]: print df2.groupby(['A', 'B', 'C']).size().reindex(idx).fillna(0).reset_index().rename(columns={0: 'count'})
     A    B    C  count
0   no   no   no      1
1   no   no  yes      0
2   no  yes   no      1
3   no  yes  yes      1
4  yes   no   no      2
5  yes   no  yes      0
6  yes  yes   no      2
7  yes  yes  yes      0

相关问题 更多 >