Python Pandas:获取到用于填充缺失/na值的行的距离

Python Pandas:获取到用于填充缺失/na值的行的距离,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,我会尽力解释这一点 我有一个pandas数据帧,我正在尝试获取到用于填充同一数据帧中的nan值行的行的距离 为了详细说明,假设我有以下数据帧(df),其中包含两行nan值 A B C 0 0.0 0.0 0.0 1 1.0 2.0 3.0 2 NaN NaN NaN 3 NaN NaN NaN 使用forward filldf.fillna(method='ffill'),我得到以下数据帧 A B C 0 0.0 0.0

我会尽力解释这一点

我有一个pandas数据帧,我正在尝试获取到用于填充同一数据帧中的
nan
值行的行的距离

为了详细说明,假设我有以下数据帧(
df
),其中包含两行
nan

     A    B    C
0  0.0  0.0  0.0
1  1.0  2.0  3.0
2  NaN  NaN  NaN
3  NaN  NaN  NaN
使用forward fill
df.fillna(method='ffill')
,我得到以下数据帧

     A    B    C
0  0.0  0.0  0.0
1  1.0  2.0  3.0
2  1.0  2.0  3.0
3  1.0  2.0  3.0
我想在dataframe中有另一列(我们称之为
接近度
),它包含到填充nan值的行的距离,在本例中,它应该是

     A    B    C  Proximity
0  0.0  0.0  0.0  0.0
1  1.0  2.0  3.0  0.0
2  1.0  2.0  3.0  1.0
3  1.0  2.0  3.0  2.0
第2行的接近度为1,因为它使用其上方的行填充自己的
nan

第3行的接近度为2,因为它使用其上方两级的行来填充自己的
nan

行1已填充,因此,它用来填充自己的
nan
值的行为零,因为它没有任何
nan

有没有一种方法可以有效地计算
接近度

所谓高效,我的意思是不使用
进行
循环

提前谢谢

您可以使用:

def prox(series):
    groupby_idx = series.notnull().cumsum()
    groupby = series.groupby(groupby_idx)
    return groupby.apply(lambda x: pd.Series(range(len(x)))).values

prox(df1.A)

array([0, 0, 1, 2], dtype=int64)
然后分配给df1:

df1['Proximity'] = prox(df1.A)

print df1.ffill()

     A    B    C  Proximity
0  0.0  0.0  0.0          0
1  1.0  2.0  3.0          0
2  1.0  2.0  3.0          1
3  1.0  2.0  3.0          2

可能是这样的:

In[1]: df = pd.DataFrame({"A": [1, np.nan, np.nan], "B": [2, np.nan, np.nan]})

In[2]: df.ix[df.B.isnull(), 'distance'] = 1

In[3]: df.distance = df.distance.cumsum()

In[4]: df
Out[4]: 
     A    B  distance
0  1.0  2.0       NaN
1  NaN  NaN       1.0
2  NaN  NaN       2.0

您可以使用
.cumsum()
使每个
notnull
块值获得唯一的“id”
.groupby()
结果并使用
.cumcount()
,它将
0
分配给所有
notnull
值,并将连续计数分配给
null
值:

df['proximity'] = df.groupby(df.notnull().all(axis=1).cumsum()).cumcount()
一些样本数据:

df = pd.DataFrame(np.random.randint(0, 10, size=(100, 3)), columns=list('ABC'))
df.loc[np.random.choice(np.arange(100), 50)] = np.nan
结果:

      A    B    C  proximity
0   5.0  5.0  3.0          0
1   2.0  3.0  1.0          0
2   0.0  2.0  4.0          0
3   NaN  NaN  NaN          1
4   NaN  NaN  NaN          2
5   5.0  3.0  5.0          0
6   NaN  NaN  NaN          1
7   6.0  7.0  8.0          0
8   1.0  5.0  2.0          0
9   NaN  NaN  NaN          1
10  5.0  9.0  6.0          0
11  NaN  NaN  NaN          1
12  7.0  8.0  8.0          0
13  7.0  7.0  5.0          0
14  4.0  9.0  5.0          0
15  NaN  NaN  NaN          1
16  2.0  9.0  8.0          0
17  NaN  NaN  NaN          1
18  NaN  NaN  NaN          2
19  8.0  6.0  7.0          0
20  8.0  2.0  0.0          0
21  1.0  3.0  1.0          0
22  0.0  3.0  9.0          0
23  8.0  3.0  9.0          0
24  NaN  NaN  NaN          1
25  9.0  3.0  6.0          0
26  NaN  NaN  NaN          1
27  9.0  0.0  8.0          0
28  0.0  4.0  9.0          0
29  8.0  8.0  3.0          0
..  ...  ...  ...        ...
70  NaN  NaN  NaN          1
71  NaN  NaN  NaN          2
72  4.0  9.0  4.0          0
73  8.0  2.0  6.0          0
74  2.0  8.0  2.0          0
75  3.0  3.0  6.0          0
76  0.0  9.0  1.0          0
77  8.0  0.0  8.0          0
78  3.0  0.0  6.0          0
79  2.0  4.0  6.0          0
80  4.0  2.0  4.0          0
81  1.0  5.0  2.0          0
82  5.0  4.0  2.0          0
83  NaN  NaN  NaN          1
84  NaN  NaN  NaN          2
85  1.0  2.0  8.0          0
86  3.0  2.0  8.0          0
87  4.0  1.0  2.0          0
88  2.0  8.0  0.0          0
89  2.0  2.0  6.0          0
90  7.0  5.0  9.0          0
91  0.0  6.0  8.0          0
92  NaN  NaN  NaN          1
93  9.0  5.0  8.0          0
94  NaN  NaN  NaN          1
95  NaN  NaN  NaN          2
96  NaN  NaN  NaN          3
97  1.0  4.0  2.0          0
98  NaN  NaN  NaN          1
99  7.0  2.0  5.0          0

接近度可能因列而异。你确定一行要么全是NaN要么全是None吗?说得好!是的,我们可以假设某一行要么全是NaN,要么没有;否则,可能每个列都有接近度?谢谢