首页 > 解决方案 > 操作 pandas 数据框列中的列表(例如除以另一列)

问题描述

我有一个熊猫数据框,其中一列包含列表。我希望将每一行中的每个列表元素除以另一列中的标量值。在以下示例中,我希望将 a 中的每个元素除以 b:

              a   b
0  [11, 22, 33]  11
1  [12, 24, 36]   2
2  [33, 66, 99]   3

从而产生以下结果:

              a   b                   c
0  [11, 22, 33]  11     [1.0, 2.0, 3.0]
1  [12, 24, 36]   2   [6.0, 12.0, 18.0]
2  [33, 66, 99]   3  [11.0, 22.0, 33.0]

我可以通过以下代码实现这一点:

import pandas as pd

df = pd.DataFrame({"a":[[11,22,33],[12,24,36],[33,66,99]], "b" : [11,2,3]})

result = {"c":[]}
for _, row in df.iterrows():
    result["c"].append([x / row["b"] for x in row["a"]])

df_c = pd.DataFrame(result)
df = pd.concat([df,df_c], axis="columns")

但是对行进行显式迭代并将结果收集到字典中,将其转换为数据帧,然后连接到原始数据帧似乎非常低效和不优雅

有没有人有更好的解决方案?

在此先感谢和欢呼!


PS:如果您想知道我为什么要将列表存储在列中:这些是傅立叶变换的结果幅度。

为什么我不为每个频率使用一列?

  1. 为每个频率创建一个新列非常慢
  2. 在我的项目中使用不同的采样率和 FFT 窗口大小,有多组频率。

标签: pythonpandaslistperformancefft

解决方案


压缩两列,通过productstarmap的组合将 col a 中的每个条目与其在 col b 中的相应条目分开,并将迭代器转换回列表。

from itertools import product,starmap
from operator import floordiv
df['c'] = [list(starmap(floordiv,(product(num,[denom])))) 
           for num, denom in zip(df.a,df.b)]


        a           b       c
0   [11, 22, 33]    11  [1, 2, 3]
1   [12, 24, 36]    2   [6, 12, 18]
2   [33, 66, 99]    3   [11, 22, 33]

或者,你可以在迭代中使用 numpy 数组:

df['c'] = [list(np.array(num)/denom) for num, denom in zip(df.a,df.b)]

感谢@jezrael 的建议——所有这些都可能是不必要的,因为 scipy 对FFT有一些帮助——看看链接,看看它是否有帮助。


推荐阅读