首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件的Python填充

基于条件的Python填充
EN

Stack Overflow用户
提问于 2020-03-25 14:19:32
回答 2查看 1.3K关注 0票数 0

我有以下按数据文件分组的dataframe,我只想为那些包含超过一半数据的‘组’填充of (method=‘b填充’)。

代码语言:javascript
复制
df.groupby('datafile').count()

datafile   column1   column2 column3 column4

datafile1     5         5       3       4         
datafile2     5         5       4       5
datafile3     5         5       5       5 
datafile4     5         5       0       0     
datafile5     5         5       1       1

正如您在上面的df中所看到的,我想填充那些包含大部分信息的组,而不是那些没有或很少有信息的组。所以我在想,在某种情况下,比如填充,有超过一半的计数,而不填充其余的,或者少于一半的。

我正在为如何设置我的条件而挣扎,因为它涉及到使用groupby和原始df的结果。

帮助是很感激的。

示例df:

代码语言:javascript
复制
index        datafile    column1   column2 column3 column4

0            datafile1      5       5        NaN      20         
1            datafile1      6       6        NaN      21         
2            datafile1      7       7        9        NaN         
3            datafile1      8       8        10       23         
4            datafile1      9       9        11       24         
5            datafile2      3       3        2        7         
6            datafile2      4       4        3        8         
7            datafile2      5       5        4        9         
8            datafile2      6       6        NaN      10         
9            datafile2      7       7        6        11         
10           datafile3      10      10       24       4         
11           datafile3      11      11       25       5         
12           datafile3      12      12       26       6         
13           datafile3      13      13       27       7         
14           datafile3      14      14       28       8         
15           datafile4      4       4        NaN      NaN         
16           datafile4      5       5        NaN      NaN         
17           datafile4      6       6        NaN      NaN         
18           datafile4      7       7        NaN      NaN         
19           datafile4      8       8        NaN      NaN         
19           datafile4      9       9        NaN      NaN         
20           datafile5      7       7        1        3  
21           datafile5      8       8        NaN      NaN         
22           datafile5      9       9        NaN      NaN         
23           datafile5      10      10       NaN      NaN         
24           datafile5      11      1        NaN      NaN                

预期产出df:

代码语言:javascript
复制
index        datafile    column1   column2 column3 column4

0            datafile1      5       5        9        20         
1            datafile1      6       6        9        21         
2            datafile1      7       7        9        23         
3            datafile1      8       8        10       23         
4            datafile1      9       9        11       24         
5            datafile2      3       3        2        7         
6            datafile2      4       4        3        8         
7            datafile2      5       5        4        9         
8            datafile2      6       6        6        10         
9            datafile2      7       7        6        11         
10           datafile3      10      10       24       4         
11           datafile3      11      11       25       5         
12           datafile3      12      12       26       6         
13           datafile3      13      13       27       7         
14           datafile3      14      14       28       8         
15           datafile4      4       4        NaN      NaN         
16           datafile4      5       5        NaN      NaN         
17           datafile4      6       6        NaN      NaN         
18           datafile4      7       7        NaN      NaN         
19           datafile4      8       8        NaN      NaN         
19           datafile4      9       9        NaN      NaN         
20           datafile5      7       7        1        3  
21           datafile5      8       8        NaN      NaN         
22           datafile5      9       9        NaN      NaN         
23           datafile5      10      10       NaN      NaN         
24           datafile5      11      1        NaN      NaN 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-25 15:21:14

如果非空值​​在每列中的比例大于或等于0.5,则使用null方法填充:

代码语言:javascript
复制
rate = 0.5
not_na = df.notna()
g = not_na.groupby(df['datafile'])
df_fill = (
    df.bfill()         
    .where(
        g.transform('sum')
        .div(g['datafile'].transform('size'), axis=0)
        .ge(rate) |
        not_na
    )
)
print(df_fill)

代码语言:javascript
复制
    index   datafile  column1  column2  column3  column4
0       0  datafile1        5        5      9.0     20.0
1       1  datafile1        6        6      9.0     21.0
2       2  datafile1        7        7      9.0     23.0
3       3  datafile1        8        8     10.0     23.0
4       4  datafile1        9        9     11.0     24.0
5       5  datafile2        3        3      2.0      7.0
6       6  datafile2        4        4      3.0      8.0
7       7  datafile2        5        5      4.0      9.0
8       8  datafile2        6        6      6.0     10.0
9       9  datafile2        7        7      6.0     11.0
10     10  datafile3       10       10     24.0      4.0
11     11  datafile3       11       11     25.0      5.0
12     12  datafile3       12       12     26.0      6.0
13     13  datafile3       13       13     27.0      7.0
14     14  datafile3       14       14     28.0      8.0
15     15  datafile4        4        4      NaN      NaN
16     16  datafile4        5        5      NaN      NaN
17     17  datafile4        6        6      NaN      NaN
18     18  datafile4        7        7      NaN      NaN
19     19  datafile4        8        8      NaN      NaN
20     19  datafile4        9        9      NaN      NaN
21     20  datafile5        7        7      1.0      3.0
22     21  datafile5        8        8      NaN      NaN
23     22  datafile5        9        9      NaN      NaN
24     23  datafile5       10       10      NaN      NaN
25     24  datafile5       11        1      NaN      NaN

此外,我们还可以使用:

代码语言:javascript
复制
m = (not_na.groupby(df['datafile'], sort=False)
           .sum()
           .div(df['datafile'].value_counts(), axis=0)
           .ge(rate)
           .reindex(df['datafile']).reset_index(drop=True))
df.bfill().where(m | not_na)

对于示例数据,这两种方法都有相似的返回。

代码语言:javascript
复制
%%timeit
rate = 0.5
not_na = df.notna()
m = (not_na.groupby(df['datafile'], sort=False)
           .sum()
           .div(df['datafile'].value_counts(),axis=0)
           .ge(rate)
           .reindex(df['datafile']).reset_index(drop=True))
df.bfill().where(m | not_na)
11.1 ms ± 53.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

代码语言:javascript
复制
%%timeit
rate = 0.5
not_na = df.notna()
g = not_na.groupby(df['datafile'])
df_fill = (df.bfill()
             .where(g.transform('sum').div(g['datafile'].transform('size'),
                                           axis=0).ge(rate) |
                      not_na)
            )
12.9 ms ± 225 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
票数 1
EN

Stack Overflow用户

发布于 2020-03-25 15:42:28

使用pandas.groupby.filter

代码语言:javascript
复制
def most_not_null(x): return x.isnull().sum().sum() < (x.notnull().sum().sum() // 2)

filtered_groups = df.groupby('datafile').filter(most_not_null)
df.loc[filtered_groups.index] = filtered_groups.bfill()

输出

代码语言:javascript
复制
>>> df
    index   datafile  column1  column2  column3  column4
0       0  datafile1        5        5      9.0     20.0
1       1  datafile1        6        6      9.0     21.0
2       2  datafile1        7        7      9.0     23.0
3       3  datafile1        8        8     10.0     23.0
4       4  datafile1        9        9     11.0     24.0
5       5  datafile2        3        3      2.0      7.0
6       6  datafile2        4        4      3.0      8.0
7       7  datafile2        5        5      4.0      9.0
8       8  datafile2        6        6      6.0     10.0
9       9  datafile2        7        7      6.0     11.0
10     10  datafile3       10       10     24.0      4.0
11     11  datafile3       11       11     25.0      5.0
12     12  datafile3       12       12     26.0      6.0
13     13  datafile3       13       13     27.0      7.0
14     14  datafile3       14       14     28.0      8.0
15     15  datafile4        4        4      NaN      NaN
16     16  datafile4        5        5      NaN      NaN
17     17  datafile4        6        6      NaN      NaN
18     18  datafile4        7        7      NaN      NaN
19     19  datafile4        8        8      NaN      NaN
20     19  datafile4        9        9      NaN      NaN
21     20  datafile5        7        7      1.0      3.0
22     21  datafile5        8        8      NaN      NaN
23     22  datafile5        9        9      NaN      NaN
24     23  datafile5       10       10      NaN      NaN
25     24  datafile5       11        1      NaN      NaN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60850731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档