在数据框列熊猫

时间:2021-02-01 11:00:11

标签: arrays pandas dataframe numpy std

(熊猫版本 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() 的构造不同。无论如何,有人知道如何在不将数组分成几列的情况下计算 std 和 max(以及 min 等)吗?

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

1 个答案:

答案 0 :(得分:1)

您可以将列转换为二维数组并使用 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)