Python Pandas:获取到用于填充缺失/na值的行的距离
我会尽力解释这一点 我有一个pandas数据帧,我正在尝试获取到用于填充同一数据帧中的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
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 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,要么没有;否则,可能每个列都有接近度?谢谢