【问题标题】:Pandas fill nan values with a split of the first available value熊猫用第一个可用值的拆分填充 nan 值
【发布时间】:2019-06-26 13:32:02
【问题描述】:

我正在尝试将 DataFrame 中的 nan 值替换为以下所有 nan 值中第一个可用值的拆分。

在下面的例子中:

import pandas as pd
df = [100, None, None, 40, None, 120]
df = pd.DataFrame(df)

我想得到:

[33.33, 33.33, 33.33, 20, 20, 120]

如果我能找到一种方法来计算列中每个值后面的 nan 值的数量,那么我可以运行一些计算来实现拆分。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    用途:

    import pandas as pd
    df = [100, None, None, 40, None, 120]
    df = pd.DataFrame(df, columns=['a'])
    
    s = df['a'].ffill() / df.groupby(df['a'].notna().cumsum())['a'].transform('size')
    print (s)
    
    0     33.333333
    1     33.333333
    2     33.333333
    3     20.000000
    4     20.000000
    5    120.000000
    Name: a, dtype: float64
    

    详情

    您可以用ffill 之前的非NaNs 值替换缺失值:

    print (df['a'].ffill())
    0    100.0
    1    100.0
    2    100.0
    3     40.0
    4     40.0
    5    120.0
    Name: a, dtype: float64
    

    然后通过Series.notna比较并通过Series.cumsum创建组:

    print (df['a'].notna().cumsum())
    0    1
    1    1
    2    1
    3    2
    4    2
    5    3
    Name: a, dtype: int32
    

    并获得与 GroupBy.transform 相同大小的每个组的计数:

    print (df.groupby(df['a'].notna().cumsum())['a'].transform('size'))
    0    3
    1    3
    2    3
    3    2
    4    2
    5    1
    Name: a, dtype: int64
    

    【讨论】:

    • 如果数据框也有一个名为“类别”的列,你能否提供一个解决方案,我想完全应用你的解决方案,但在做了一种关闭 df.groupby( '类别').apply(your_solution_for_each_group)
    • @Waroulolz 使用 s = df.groupby('category')['a'].ffill() / df.groupby(['category', df['a'].notna().cumsum()] )['a'].transform('size') print (s),仅限手机,因此未经测试。
    【解决方案2】:

    也许使用ffill,并获取第一列,然后除以它(ffilled 数据框)groupbyed 并使用transform('count') 获取计数并保持数据框的相同长度:

    print(df.ffill()[0] / df.ffill().groupby(0)[0].transform('count'))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多