python - 如何展平pandas数据框中的数组

标签 python pandas series flatten

假设我有一个 pandas 数据框,例如

df_p = pd.DataFrame(
   {'name_array':
    [[20130101, 320903902, 239032902],
     [20130101, 3253453, 239032902],
     [65756, 4342452, 32425432523]],
    'name': ['a', 'a', 'c']} )

Image of dataframe

我想提取包含每行中的展平数组的系列,同时保留顺序

预期结果是pandas.core.series.Series

Image of expected output

这个问题不是重复的,因为我的预期输出是 pandas 系列,而不是数据框。

最佳答案

使用 melt 的解决方案比 OP 的原始方法慢,他们在答案 here 中分享了该方法。 ,特别是在我对该答案的评论加速之后。

我创建了一个更大的数据框来测试:

df = pd.DataFrame({'name_array': np.random.rand(1000, 3).tolist()})

并在此数据帧产量上使用 melt 对两个解决方案进行计时:

In [16]: %timeit pd.melt(df.name_array.apply(pd.Series).reset_index(), id_vars=['index'],value_name='name_array').drop('variable', axis=1).sort_values('index')
173 ms ± 5.68 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [17]: %timeit df['name_array'].apply(lambda x: pd.Series([i for i in x])).melt().drop('variable', axis=1)['value']
175 ms ± 4.86 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

OP的方法以及我在评论中建议的加速:

In [18]: %timeit pd.Series(np.concatenate(df['name_array']))
18 ms ± 887 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

最后,提供最快的解决方案 here但修改为提供一系列而不是数据帧输出:

In [14]: from itertools import chain
In [15]: %timeit pd.Series(list(chain.from_iterable(df['name_array'])))
402 µs ± 4.68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

最后一个方法比 melt() 快 3 个数量级,比 np.concatenate() 快 2 个数量级。

关于python - 如何展平pandas数据框中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55126339/

相关文章:

python - 如何将FastAPI请求转发到另一台服务器?

python - 使用 Python dataframe 高效地将数百万行写入文件

pandas - 将 Pandas Series 作为列附加到 DataFrame

python - 检查IP是否在Python中的CIDR范围内

python - 查找连续的未屏蔽值

python - 在python中将整数列表转换为范围

python - 如何从 Pandas 中提取列表?

python - 让 pandas Wide_to_long() 函数考虑 stub 在列名的末尾而不是开头

python - DataFrame.groupby(column).apply(len) 和 DataFrame[column].value_counts() 有什么区别?

java - 使用级数确定 double 的平方根