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

Ale*_*lex 5 python series flatten pandas

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

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

数据框图像

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

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

预期输出图像

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

alk*_*asm 5

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

\n\n

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

\n\n
df = pd.DataFrame({\'name_array\': np.random.rand(1000, 3).tolist()})\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
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\')\n173 ms \xc2\xb1 5.68 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n\nIn [17]: %timeit df[\'name_array\'].apply(lambda x: pd.Series([i for i in x])).melt().drop(\'variable\', axis=1)[\'value\']\n175 ms \xc2\xb1 4.86 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
In [18]: %timeit pd.Series(np.concatenate(df[\'name_array\']))\n18 ms \xc2\xb1 887 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,这里提供了最快的解决方案,但经过修改以提供一系列而不是数据帧输出:

\n\n
In [14]: from itertools import chain\nIn [15]: %timeit pd.Series(list(chain.from_iterable(df[\'name_array\'])))\n402 \xc2\xb5s \xc2\xb1 4.68 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一种方法的速度快了melt()3 个数量级,并且快了np.concatenate()2 个数量级。

\n


Ale*_*lex 2

这是我想出的解决方案。不知道有没有更有效的方法。

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

data = pd.DataFrame( {'column':np.concatenate(df_p['name_array'].values)} )['column']
Run Code Online (Sandbox Code Playgroud)

输出:

[0       20130101
 1      320903902
 2      239032902
 3       20130101
 4        3253453
 5      239032902
 6          65756
 7        4342452
 8    32425432523
 Name: column, dtype: int64]
Run Code Online (Sandbox Code Playgroud)