Pandas在groupby内插入

R. *_* W. 10 python interpolation group-by pandas

我有一个包含以下信息的数据框:

    filename    val1    val2
t                   
1   file1.csv   5       10
2   file1.csv   NaN     NaN
3   file1.csv   15      20
6   file2.csv   NaN     NaN
7   file2.csv   10      20
8   file2.csv   12      15
Run Code Online (Sandbox Code Playgroud)

我想基于索引在数据帧中插入值,但仅在每个文件组中.

为了插值,我通常会这样做

df = df.interpolate(method="index")
Run Code Online (Sandbox Code Playgroud)

我去做分组

grouped = df.groupby("filename")
Run Code Online (Sandbox Code Playgroud)

我希望插值数据框看起来像这样:

    filename    val1    val2
t                   
1   file1.csv   5       10
2   file1.csv   10      15
3   file1.csv   15      20
6   file2.csv   NaN     NaN
7   file2.csv   10      20
8   file2.csv   12      15
Run Code Online (Sandbox Code Playgroud)

NaN仍然存在于t = 6,因为它们是file2组中的第一项.

我怀疑我需要使用"申请",但未能确切地知道如何......

grouped.apply(interp1d)
...
TypeError: __init__() takes at least 3 arguments (2 given)
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Ale*_*der 10

>>> df.groupby('filename').apply(lambda group: group.interpolate(method='index'))
    filename  val1  val2
t                       
1  file1.csv     5    10
2  file1.csv    10    15
3  file1.csv    15    20
6  file2.csv   NaN   NaN
7  file2.csv    10    20
8  file2.csv    12    15
Run Code Online (Sandbox Code Playgroud)

  • 这似乎适用于一个小的数据帧,但在一个大的数据帧上需要*长时间*(比使用 .interpolate() 突出的时间多几个数量级)。你会期望效率会差那么多吗?与行数相比,组数很小(大约 1000 组与 10^7 行相比)。 (2认同)

PMe*_*nde 8

我也遇到了这个。apply您可以使用代替使用,transform如果您拥有 1000 个组,这将减少超过 25% 的运行时间:

import numpy as np
import pandas as pd

np.random.seed(500)
test_df = pd.DataFrame({
    'a': np.random.randint(low=0, high=1000, size=10000),
    'b': np.random.choice([1, 2, 4, 7, np.nan], size=10000, p=([0.2475]*4 + [0.01]))
})
Run Code Online (Sandbox Code Playgroud)

测试:

%timeit test_df.groupby('a').transform(pd.DataFrame.interpolate)
Run Code Online (Sandbox Code Playgroud)

输出: 566 ms ± 27.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test_df.groupby('a').apply(pd.DataFrame.interpolate)
Run Code Online (Sandbox Code Playgroud)

输出: 788 ms ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test_df.groupby('a').apply(lambda group: group.interpolate())
Run Code Online (Sandbox Code Playgroud)

输出: 787 ms ± 17.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit test_df.interpolate()
Run Code Online (Sandbox Code Playgroud)

输出: 918 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

与对interpolate完整 DataFrame的完全矢量化调用相比,您仍然会看到运行时间显着增加,但我认为在 Pandas 中您不会做得更好。

  • 您使用“transform”的解决方案没有给出所需的输出。 (2认同)