尽管存在一些类似的问题,但我找不到以下简单的答案。请注意,我来自R,对Pandas来说还很陌生。
假设我有一个熊猫数据框df,其中包含两列:“度量”(具有3个级别的unicode)和“空气质量”(numpy.float64)。
我想基于“空气质量”中的值创建一个名为“颜色”的第三列。此外,我想针对“度量”的每个级别分别执行此操作。我已经成功通过使用df.loc在“ measure”上分割了df。然后,我使用以下代码分别在每个df中计算“颜色”:
#calculate the maximum value of "Airquality" in df for each "measure" level:
maxi = df['Airquality'].max()
#initialize the column for "color" in df for each "measure" level:
df['color'] = None
#find the maximum value of "Airquality" in df for each "measure" level:
maxi = df['Airquality'].max()
#loop through the rows calculating and assigning the value for color,
#again, in df for each "measure" level
for i in range(len(df['Airquality'])):
df['color'][i] = int(100*df['Airquality'][i]/maxi)]
但是,这在我正在使用的大型数据集上运行非常缓慢,并且我确信必须有更好的方法...可能使用某些Pandas函数,并且可能无需将df分为三部分,每个“度量”级别。发布此文章是为了希望能从众多Python天才中学习之一。
我认为您可以使用这些groupby
工具,尤其是transform
。从框架开始(顺便说一句,习惯上自己展示一个示例数据框架):
In [21]: df = pd.DataFrame({"measure": ["a","a","b","a","c","c"],
...: "aq": [10,20,30,20,30,50]})
In [22]: df["colour"] = (100.0 * df["aq"] /
df.groupby("measure")["aq"].transform(max))
In [23]: df
Out[23]:
aq measure colour
0 10 a 50.0
1 20 a 100.0
2 30 b 100.0
3 20 a 100.0
4 30 c 60.0
5 50 c 100.0
之所以起作用,是因为我们通过对小节列进行分组,找到每个不同小节值的aq列的最大值,并将其广播到整个帧中来获得正确的分母,这就是这样做的:
In [24]: df.groupby("measure")["aq"].transform(max)
Out[24]:
0 20
1 20
2 30
3 20
4 50
5 50
Name: aq, dtype: int64
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句