【问题标题】:How to sum columns containing arrays如何对包含数组的列求和
【发布时间】:2019-06-14 21:35:34
【问题描述】:

我在总结每个单元格中包含数组的数据框的列时遇到问题。 我尝试使用 df.sum() 对列进行汇总,期望得到总列数组,例如“common”列的 [4,1,1,4,1]。 但我只有一个空系列。

df_sum = df.sum()
print(df_sum)

Series([], dtype: float64)

在这种情况下如何获取汇总列?

【问题讨论】:

  • 你的 df.sum() 参数这里不是空的吗?

标签: python arrays pandas dataframe sum


【解决方案1】:

好吧,在 pandas DataFrames 中使用 object dtypes 通常不是一个好主意,尤其是用 python 列表填充单元格,因为你会失去性能。

不过,您可以使用itertools.chain.from_iterable 来完成此操作

df.apply(lambda s: list(it.chain.from_iterable(s.dropna())))

你也可以使用sum,但我会说它更慢

df.apply(lambda s: s.dropna().sum())

我明白为什么你会认为 df.sum 会在这里工作,即使明确设置 skipna=True,但矢量化的 df.sum 在这种情况下会表现出奇怪的行为。但话又说回来,这些是使用带有列表的 DataFrame 的缺点

【讨论】:

  • 感谢您的响应和性能提示。为了简单起见,我使用实际的数据框来可视化数据。但我知道以后我将不得不迁移到更高效的数据结构。有什么想法吗?
【解决方案2】:

IIUC,您或许可以只使用列表推导来处理您的任务:

df = pd.DataFrame({'d1':[np.nan, [1,2], [4]], 'd2':[[3], np.nan, np.nan]})

>>> df
       d1   d2
0     NaN  [3]
1  [1, 2]  NaN
2     [4]  NaN

df_sum = [i for a in df['d1'] if type(a) is list for i in a]

>>> df_sum
[1, 2, 4]

如果您需要对整个 DataFrame(或多列)进行求和,请在使用列表推导之前使用 numpy.ravel() 展平数据框。

df_sum = [i for a in np.ravel(df.values) if type(a) is list for i in a]

>>> df_sum
[3, 1, 2, 4]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2022-12-05
    相关资源
    最近更新 更多