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不能与重复值一起使用。我知道我总是可以通过传统的方式来实现,即在一行到一行的循环中进行迭代来修复它,但是如果使用大数据,这恐怕会很耗时。
如果有人可以给我提示,我将不胜感激。
您需要以某种方式创建组 - 这里使用值的差异#并与>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)