python - 操作 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:如果您想知道我为什么要将列表存储在列中:这些是傅立叶变换的结果幅度。
为什么我不为每个频率使用一列?
- 为每个频率创建一个新列非常慢
- 在我的项目中使用不同的采样率和 FFT 窗口大小,有多组频率。
解决方案
压缩两列,通过product和starmap的组合将 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有一些帮助——看看链接,看看它是否有帮助。
推荐阅读
- r - 用 dplyr 在 R 中索引一个组
- google-cloud-platform - SuiteCRM、GCP 和 Maria DB - 太多了?
- javascript - 如何使用为 webp 服务的自定义 url 图像更改博客中的所有 url 图像
- xcode - 如何在我的物理手表上从 XCode 预览我的应用程序
- html - 制作浮箱 100% 集装箱箱
- python - 在 pygame 游戏中更改精灵时,速度下降
- flutter - 如何在颤动中获取本地化的日期字符串?
- r - 滞后时间序列数据
- ruby-on-rails - ActiveRecord / Arel 链上的关联条件
- python - 从 Python 中的有序列表中绘制 2D 多个向量