使用 groupby 对象 --pandas 编辑数据框条目

use*_*396 4 python group-by dataframe pandas

考虑以下数据框:

     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
Run Code Online (Sandbox Code Playgroud)

我需要在“信号”中“填充”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
Run Code Online (Sandbox Code Playgroud)

现在我按对象迭代每个数据帧并填充 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])
Run Code Online (Sandbox Code Playgroud)

哪种有效,但考虑到数据框很大,真的很慢。我想知道是否有其他方法可以使用或不使用 groupby 方法。谢谢!

编辑:

感谢 Alexander 和 jwilner 提供替代方法。然而,对于我有 800,000 行数据的大数据帧来说,这两种方法都很慢。

jwi*_*ner 5

使用apply方法。

In [56]: df = pd.DataFrame({"count": [1] * 4 + [2] * 5 + [3] * 2 , "signal": [1] + [None] * 4 + [-1] + [None] * 5})

In [57]: df
Out[57]:
    count  signal
0       1       1
1       1     NaN
2       1     NaN
3       1     NaN
4       2     NaN
5       2      -1
6       2     NaN
7       2     NaN
8       2     NaN
9       3     NaN
10      3     NaN

[11 rows x 2 columns]

In [58]: def ffill_signal(df):
   ....:     df["signal"] = df["signal"].ffill()
   ....:     return df
   ....:

In [59]: df.groupby("count").apply(ffill_signal)
Out[59]:
    count  signal
0       1       1
1       1       1
2       1       1
3       1       1
4       2     NaN
5       2      -1
6       2      -1
7       2      -1
8       2      -1
9       3     NaN
10      3     NaN

[11 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)

但是,请注意groupby重新排序的东西。如果计数列并不总是保持不变或增加,而是可以在其中重复值,则groupby可能有问题。也就是说,给定count像的系列[1, 1, 2, 2, 1]groupby将像这样分组:[1, 1, 1], [2, 2],这可能会对您的前向填充产生不良影响。如果这是不希望的,你必须创建一个新的系列来使用groupby它总是保持不变或根据计数系列的变化而增加——可能使用pd.Series.diffpd.Series.cumsum