用重复模式填充python pandas数据框中的缺失行

B.J*_*.J. 7 dataframe python-3.x pandas

我正在尝试修复像这样的pandas DataFrame中缺少的行:

import pandas as pd

df = pd.DataFrame([[1, 1.2, 3.4], [2, 4.5, 6.7], [3, 1.3, 2.5], [4, 5.6, 7.3],
               [1, 3.4, 5.8], [2, 5.7, 8.9], [4, 2.4, 2.6], [1, 6.7, 8.4],
               [3, 6.9, 4.2], [4, 4.2, 1.2]], columns = ['#', 'foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我一个这样的熊猫数据框:

Out[10]: 
   #  foo  bar
0  1  1.2  3.4
1  2  4.5  6.7
2  3  1.3  2.5
3  4  5.6  7.3
4  1  3.4  5.8
5  2  5.7  8.9
6  4  2.4  2.6
7  1  6.7  8.4
8  3  6.9  4.2
9  4  4.2  1.2
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,该'#'列中的值处于重复模式,1, 2, 3, 4, 1, 2, 3, 4 ...但有一些缺失值(在本例中,3在第6 2行之前和第8 行之前)。 我的问题是:根据'#'列的重复模式,大熊猫中是否有任何内置方法(函数)来填充此数据框中的缺失行?填充行其他列中的值可以是NaN,也可以是填充行之前和/或之后的值的插值\外推\平均值。换句话说,我想要的是这样的:

Out[16]: 
    #  foo  bar
0   1  1.2  3.4
1   2  4.5  6.7
2   3  1.3  2.5
3   4  5.6  7.3
4   1  3.4  5.8
5   2  5.7  8.9
6   3  NaN  NaN
7   4  2.4  2.6
8   1  6.7  8.4
9   2  NaN  NaN
10  3  6.9  4.2
11  4  4.2  1.2
Run Code Online (Sandbox Code Playgroud)

我试图将'#'列设置为数据框的索引,并使用常规模式对其进行重新索引,而不会丢失值。但是问题是pd.reindex不能与重复值一起使用。我知道我总是可以通过传统的方式来实现,即在一行到一行的循环中进行迭代来修复它,但是如果使用大数据,这恐怕会很耗时。

如果有人可以给我提示,我将不胜感激。

jez*_*ael 3

您需要以某种方式创建组 - 这里使用值的差异#并与>1by进行比较,然后与 一起Series.le使用:GroupBy.applySeries.reindex

df1 = (df.groupby(df['#'].diff().lt(1).cumsum())
         .apply(lambda x: x.set_index('#').reindex(range(1, 5)))
         .reset_index(level=0, drop=True)
         .reset_index())

print (df1)
    #  foo  bar
0   1  1.2  3.4
1   2  4.5  6.7
2   3  1.3  2.5
3   4  5.6  7.3
4   1  3.4  5.8
5   2  5.7  8.9
6   3  NaN  NaN
7   4  2.4  2.6
8   1  6.7  8.4
9   2  NaN  NaN
10  3  6.9  4.2
11  4  4.2  1.2
Run Code Online (Sandbox Code Playgroud)

另一个想法是通过和来创建MultiIndex和重塑:unstackstack

df = (df.set_index(['#', df['#'].diff().lt(1).cumsum()])
       .unstack()
       .reindex(np.arange(4)+1)
       .stack(dropna=False)
       .sort_index(level=1)
       .reset_index(level=1, drop=True)
       .reset_index())
print (df)
    #  foo  bar
0   1  1.2  3.4
1   2  4.5  6.7
2   3  1.3  2.5
3   4  5.6  7.3
4   1  3.4  5.8
5   2  5.7  8.9
6   3  NaN  NaN
7   4  2.4  2.6
8   1  6.7  8.4
9   2  NaN  NaN
10  3  6.9  4.2
11  4  4.2  1.2
Run Code Online (Sandbox Code Playgroud)