【发布时间】:2020-09-04 15:38:48
【问题描述】:
这是我第一次使用 Stack Overflow。我对编码和 Pandas 很陌生,所以请多多包涵。我正在练习使用 Python/Pandas 而不是 Excel 操作数据,我遇到了以下问题...
我正在尝试按年份标准化特定列的值。我的数据集很小,所以我采用的方法(如下所示)效果很好,但是,我相当肯定这不是完成这项任务的好方法。有没有更好的方法通过列表推导或将函数应用于 DataFrame 来做到这一点? (附言,您可以推荐任何其他资源来学习这些主题或示例,我们将不胜感激!)
样本数据:
IN: df = pd.DataFrame(data=[[2018,10,100,50], [2018,11,110,30], [2017,12,120,10], [2017, 15, 115, 40]], columns=['Year','c1','c2','c3'])
OUT:
Year c1 c2 c3
0 2018 10 100 50
1 2018 11 110 30
2 2017 12 120 10
3 2017 15 115 40
样本输出:
Year c1 c2 c3 c1_std c2_std
0 2018 10 100 50 -0.707107 -0.707107
1 2018 11 110 30 0.707107 0.707107
2 2017 12 120 10 0.707107 0.707107
3 2017 15 115 40 -0.707107 -0.707107
请注意,标准化输出仅适用于 3 列中的 2 列
我的做法:
-
首先我创建了两个表。一个代表按列和年份的平均值,另一个代表按列和年份的标准差。
standard_devs = pd.DataFrame(data=[],index=[2018,2017], columns=['c1', 'c2']) means = pd.DataFrame(data=[],index=[2018,2017], columns=['c1', 'c2']) for y in [2018,2017]: for col in ['c1', 'c2']: standard_devs.loc[y,col] = df[df['Year']==y][col].std() means.loc[y,col] = df[df['Year']==y][col].mean() -
我遍历了我的原始数据框,并根据适当的年份和列计算了标准化值。
for i in list(df.index): for col in ['c1', 'c2']: year = df.loc[i,'Year'] df.loc[i,col+'_std'] = (df.loc[i,col]-means.loc[year, col])/standard_devs.loc[year, col]
我之前读过,遍历 pandas DataFrame 是不好的做法。我知道这种方法可能无法扩展,所以我想知道如何提高编码效率。
谢谢大家!
【问题讨论】:
-
请为输出添加一个示例,即你想要什么结果。迭代应该是 Pandas 的最后手段
-
嗨 gtomer,我已经添加了一些示例输出。
标签: python pandas lambda iteration list-comprehension