获取数据框列 pandas 中数组字段的最大值和标准值

Get max and std over array-fields in dataframe column pandas

(Pandas 版本 1.1.1.)

我将数组作为 Dataframe 列的单元格中的条目。

a = np.array([1,8])
b = np.array([5,14])
df = pd.DataFrame({'float':[1,2], 'array': [a,b]})

>    float    array
> 0      1   [1, 8]
> 1      2  [5, 14]

现在我需要对每个数组位置进行一些统计。

它与均值完美匹配:

df['array'].mean()
> array([ 3., 11.])    

但是如果我尝试用最大值来做,或者出现标准差错误:

df['array'].std()
> setting an array element with a sequence.

df['array'].max()
> The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

似乎 .mean() .std() 和 .max() 的构造不同。无论如何,有人知道如何在不将数组分成几列的情况下计算标准差和最大值(以及最小值等)吗?

(DataFrame 具有不同形状的数组。但我只想计算 .groupyby() 中数组具有相同形状的行的统计数据。)

您可以将列转换为二维数组并使用 numpy 进行计数:

a = np.array([1,8])
b = np.array([5,14])
df = pd.DataFrame({'float':[1,2], 'array': [a,b]})

#2k for test
df = pd.concat([df] * 1000, ignore_index=True)


In [150]: %timeit (pd.DataFrame(df['array'].tolist(), index=df.index).std())
4.25 ms ± 305 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [151]: %timeit (np.std(np.array(df['array'].tolist()), ddof=1, axis=0))
944 µs ± 1.59 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [152]: %timeit (pd.DataFrame(df['array'].tolist(), index=df.index).max())
4.31 ms ± 646 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [153]: %timeit (np.max(np.array(df['array'].tolist()), axis=0))
836 µs ± 1.47 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于 20k 行:

df = pd.concat([df] * 10000, ignore_index=True)


In [155]: %timeit (pd.DataFrame(df['array'].tolist(), index=df.index).std())
35.3 ms ± 87.6 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [156]: %timeit (np.std(np.array(df['array'].tolist()), ddof=1, axis=0))
9.13 ms ± 170 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [157]: %timeit (pd.DataFrame(df['array'].tolist(), index=df.index).max())
35.3 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [158]: %timeit (np.max(np.array(df['array'].tolist()), axis=0))
8.21 ms ± 27.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)