Python 统计数据帧列中的NAN窗口(及其大小)
我有巨大的数据帧(百万、十)和许多列中缺失的(NaN)值。 我需要以最快的方式(我的代码太慢)为每一列计算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
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
,那么您的预期输出是什么?请尽可能向我们展示您的尝试,这将帮助您!主要是,了解什么对你来说“太慢”将有助于构建一个“更快”的解决方案。