【问题标题】:Convert a pandas series of lists with variable length into a 1d array将具有可变长度的 pandas 系列列表转换为一维数组
【发布时间】:2018-08-11 02:06:10
【问题描述】:

我有一系列熊猫列表。现在我需要一个包含所有列表的大列表。使用df.msg.values 我会得到这样的结果:

array([list(['hi']), list(['hi', 'cat', 'dog']),  list(['smoke', 'red']),...)

现在的输出应该是一个像这样的 numpy 数组:

['hi', 'hi', 'cat', 'dog', 'smoke', 'red',...]

我的工作解决方案是连接所有列表的 for 循环。

tok = tokenized.msg.dropna()
1darr= np.array([])
for m in tok :
    1darr = np.concatenate([1darr, m])

由于np.concatenate() 可能会在数百万行中变慢,所以我尝试了np.ravel()np.flatten(),但没有任何效果。它不会将其展平为一维数组。有人知道我怎样才能有效地得到我想要的解决方案吗?

【问题讨论】:

  • 这里最好的解决方案可能是完全避免你的问题——退后一步,弄清楚如何避免出现一系列 Python 列表。这本身就是低效的。
  • 我们正在使用 DataFrames,现在我不能只改变我的整个系统。这就是为什么我尝试通过values 获取系列的numpy 数组然后进行操作的原因。最后我只需要专栏的词汇。

标签: python arrays pandas numpy


【解决方案1】:

对我来说工作:

a = np.concatenate(df['msg']).tolist()
print (a)
['hi', 'hi', 'cat', 'dog', 'smoke', 'red']

或者:

from  itertools import chain  

a = list(chain.from_iterable(df['msg']))
print (a)
['hi', 'hi', 'cat', 'dog', 'smoke', 'red']:

或者:

a = [y for x in df['msg'] for y in x]

【讨论】:

  • 谢谢,我做了一些测试,itertools 总是比第三种解决方案快一点。现在将使用 itertools。
【解决方案2】:

您应该能够简单地运行np.array(df['msg'].sum())

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 2021-11-23
    • 2021-02-19
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多