考虑以下数据帧:
index count signal
1 1 1
2 1 NAN
3 1 NAN
4 1 -1
5 1 NAN
6 2 NAN
7 2 -1
8 2 NAN
9 3 NAN
10 3 NAN
11 3 NAN
12 4 1
13 4 NAN
14 4 NAN
我需要在“信号”中“填充”NAN,并且具有不同“计数”值的值不应相互影响 . 这样我就可以获得以下数据帧:
index count signal
1 1 1
2 1 1
3 1 1
4 1 -1
5 1 -1
6 2 NAN
7 2 -1
8 2 -1
9 3 NAN
10 3 NAN
11 3 NAN
12 4 1
13 4 1
14 4 1
现在,我逐个遍历每个数据框并填充NAN值,然后复制到新的数据框:
new_table = np.array([]);
for key, group in df.groupby('count'):
group['signal'] = group['signal'].fillna(method='ffill')
group1 = group.copy()
if new_table.shape[0]==0:
new_table = group1
else:
new_table = pd.concat([new_table,group1])
哪种方法有效,但考虑到数据框架很大,确实很慢 . 我想知道是否有任何其他方法可以使用或不使用groupby方法 . 谢谢!
EDITED:
感谢Alexander和jwilner提供替代方法 . 但是对于拥有800,000行数据的大数据帧,这两种方法都非常慢 .
3 回答
使用
apply
方法 .但是,请注意
groupby
重新排序的东西 . 如果计数列不总是保持不变或增加,而是可以在其中重复值,则groupby
可能会有问题 . 也就是说,给定像[1, 1, 2, 2, 1]
这样的count
系列,groupby
会像这样分组:[1, 1, 1], [2, 2]
,这可能会对前向填充产生不良影响 . 如果这是不受欢迎的,你必须创建一个与_1541484一起使用的新系列,它始终保持不变或根据计数系列的变化而增加 - 可能使用pd.Series.diff
和pd.Series.cumsum
另一种解决方案是创建数据透视表,前向填充值,然后将它们映射回原始DataFrame .
有了800k行数据,这种方法的功效取决于“计数”中有多少个唯一值 .
与我之前的回答相比:
最后,你可以简单地使用
groupby
,虽然它比上一个方法慢:假设数据已在df ['index']上预先排序,请尝试使用
loc
: