gpt4 book ai didi

python-3.x - 使用重复模式填充 python pandas 数据框中的缺失行

转载 作者:行者123 更新时间:2023-12-04 11:46:49 26 4
gpt4 key购买 nike

我正在尝试修复 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'])

上面的代码给了我一个这样的 Pandas 数据框:
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

您可能已经注意到, '#' 中的值列的重复模式为 1, 2, 3, 4, 1, 2, 3, 4 ...但有一些缺失值(例如, 3 在第 6 行之前和 2 在第 8 行之前)。 我的问题是:pandas 中是否有任何内置方法(函数)可以根据 '#' 的重复模式填充此数据框中缺失的行柱子? 填充行其他列的值可以是 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

我试图设置 '#'列作为数据框的索引,并使用常规模式重新索引它而不会丢失值。但问题是 pd.reindex不适用于重复值。我知道我总是可以通过从一行到另一行循环迭代来修复它,但我担心如果处理大尺寸数据这将是耗时的。

如果有人能给我一个提示,我将不胜感激。

最佳答案

您需要以某种方式创建组 - 这里使用了值的差异 #并与 >1 进行比较由 Series.le , 然后使用 GroupBy.apply Series.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

另一个想法是创建 MultiIndex并通过 unstack reshape 和 stack :
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

关于python-3.x - 使用重复模式填充 python pandas 数据框中的缺失行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com