Python 统计数据帧列中的NAN窗口(及其大小)

Python 统计数据帧列中的NAN窗口(及其大小),python,python-3.x,dataframe,nan,Python,Python 3.x,Dataframe,Nan,我有巨大的数据帧(百万、十)和许多列中缺失的(NaN)值。 我需要以最快的方式(我的代码太慢)为每一列计算NAN的窗口及其大小 像这样的:我是弗罗姆 import pandas as pd import numpy as np df = pd.DataFrame({'a':[1,2, np.nan, np.nan,3,3,np.nan,4,np.nan,np.nan],\ 'b':[np.nan, 2, 1, 1, 3, 3, np.nan, np.nan,2, n

我有巨大的数据帧(百万、十)和许多列中缺失的(NaN)值。 我需要以最快的方式(我的代码太慢)为每一列计算NAN的窗口及其大小

像这样的:我是弗罗姆

import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,2, np.nan, np.nan,3,3,np.nan,4,np.nan,np.nan],\
               'b':[np.nan, 2, 1, 1, 3, 3, np.nan, np.nan,2, np.nan],\
               'c':[np.nan, 2, 1, np.nan, 3, 3, np.nan, np.nan,2, 8]})

df
Out[65]: 
 a    b    c
0  1.0  NaN  NaN
1  2.0  2.0  2.0
2  NaN  1.0  1.0
3  NaN  1.0  NaN
4  3.0  3.0  3.0
5  3.0  3.0  3.0
6  NaN  NaN  NaN
7  4.0  NaN  NaN
8  NaN  2.0  2.0
9  NaN  NaN  8.0
到这里:

result
Out[61]: 
    a  b  c
 0  2  1  1
 1  1  2  1
 2  2  1  2

这里有一种方法:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2, np.nan, np.nan,3,3,np.nan,4,np.nan,np.nan],\
               'b':[np.nan, 2, 1, 1, 3, 3, np.nan, np.nan,2, np.nan],\
               'c':[np.nan, 2, 1, np.nan, 3, 3, np.nan, np.nan,2, 8]})
df_n = pd.DataFrame({'a':df['a'].isnull().values,
                      'b':df['b'].isnull().values,
                      'c':df['c'].isnull().values})

pr={}
for column_name, _ in df_n.iteritems():

    fst = df_n.index[df_n[column_name] & ~ df_n[column_name].shift(1).fillna(False)]
    lst = df_n.index[df_n[column_name] & ~ df_n[column_name].shift(-1).fillna(False)]

    pr[column_name] = [j-i+1 for i, j in zip(fst, lst)]

df_new=pd.DataFrame(pr)
输出:

    a   b   c
0   2   1   1
1   1   2   1
2   2   1   2

这里有一种方法:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2, np.nan, np.nan,3,3,np.nan,4,np.nan,np.nan],\
               'b':[np.nan, 2, 1, 1, 3, 3, np.nan, np.nan,2, np.nan],\
               'c':[np.nan, 2, 1, np.nan, 3, 3, np.nan, np.nan,2, 8]})
df_n = pd.DataFrame({'a':df['a'].isnull().values,
                      'b':df['b'].isnull().values,
                      'c':df['c'].isnull().values})

pr={}
for column_name, _ in df_n.iteritems():

    fst = df_n.index[df_n[column_name] & ~ df_n[column_name].shift(1).fillna(False)]
    lst = df_n.index[df_n[column_name] & ~ df_n[column_name].shift(-1).fillna(False)]

    pr[column_name] = [j-i+1 for i, j in zip(fst, lst)]

df_new=pd.DataFrame(pr)
输出:

    a   b   c
0   2   1   1
1   1   2   1
2   2   1   2
尝试此选项(仅适用于
a
-对其他列进行类似操作):

df=df.assign(a\u count\u sum=0) >>>df[“a_count_sum”][np.isnan(df[“a”])]=df.groupby(np.isnan(df.a)).cumcount()+1 >>>df a、b、c、a、计数和 01.0楠楠0 1 2.0 2.0 2.0 0 2 NaN 1.0 1.0 1 3 NaN 1.0 NaN 2 4 3.0 3.0 3.0 0 5 3.0 3.0 3.0 0 6南南3 7 4.0楠楠0 8 NaN 2.0 2.0 4 9楠楠8.05 >>>res_1=df[“a_count_sum”][(df[“a_count_sum”].shift(-1)==0);(np.isnan(df[“a_count_sum”].shift(-1)))和(df[“a_count_sum”!=0)] >>>res_1 3 2 6 3 9 5 名称:a_count_sum,数据类型:int64 >>>res_2=(-res_1.shift(1.fillna(0)).astype(np.int64) >>>res_2 3 0 6 -2 9 -3 名称:a_count_sum,数据类型:int64 >>>res=res_1+res_2 >>>res 3 2 6 1 9 2 名称:a_count_sum,数据类型:int64 尝试此选项(仅适用于
a
-对其他列进行类似操作):

df=df.assign(a\u count\u sum=0) >>>df[“a_count_sum”][np.isnan(df[“a”])]=df.groupby(np.isnan(df.a)).cumcount()+1 >>>df a、b、c、a、计数和 01.0楠楠0 1 2.0 2.0 2.0 0 2 NaN 1.0 1.0 1 3 NaN 1.0 NaN 2 4 3.0 3.0 3.0 0 5 3.0 3.0 3.0 0 6南南3 7 4.0楠楠0 8 NaN 2.0 2.0 4 9楠楠8.05 >>>res_1=df[“a_count_sum”][(df[“a_count_sum”].shift(-1)==0);(np.isnan(df[“a_count_sum”].shift(-1)))和(df[“a_count_sum”!=0)] >>>res_1 3 2 6 3 9 5 名称:a_count_sum,数据类型:int64 >>>res_2=(-res_1.shift(1.fillna(0)).astype(np.int64) >>>res_2 3 0 6 -2 9 -3 名称:a_count_sum,数据类型:int64 >>>res=res_1+res_2 >>>res 3 2 6 1 9 2 名称:a_count_sum,数据类型:int64
假设您在
c
列中用另一个
NaN
代替
8.0
,那么您的预期输出是什么?如果可能,请向我们展示您的尝试,它会帮助您!主要是,了解什么对您来说“太慢”将有助于构建“更快”的解决方案。假设您在
c
列中有另一个
NaN
代替
8.0
,那么您的预期输出是什么?请尽可能向我们展示您的尝试,这将帮助您!主要是,了解什么对你来说“太慢”将有助于构建一个“更快”的解决方案。