在Pandas数据框中计算新列

10
虽然有一些类似的问题,但我找不到一个直接回答以下问题的答案。请注意,我是从R过来的,并且对Pandas非常新手。
假设我有一个包含两列的Pandas数据框df,它们是“measure”(3个unicode级别)和“Airquality”(numpy.float64)。
我想创建第三列名为“color”,它基于“Airquality”的值。此外,我想针对“measure”的每个级别单独执行此操作。我通过使用df.loc在“measure”上分割df成功了。然后,我使用以下代码在每个df中单独计算了“color”:
#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天才中学习。
2个回答

23

谢谢,我正在考虑应用一点。但是有没有办法编写代码以便分别对“measure”的三个级别进行操作?还是我需要继续使用三个单独的数据框?此外,请记住每个“measure”级别都会有不同的“maxi”值。 - davo1979
2
@davo1979 我不明白你所说的“measure”分割是什么意思... 你能在问题中提供示例数据和期望的输出吗? - wanaryytel

5

我认为您可以使用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

太棒了,这个方法可行(而且速度更快)!我曾经有过类似的尝试,但从未成功。不确定 .transform(max).max() 有什么区别,但我会去了解一下。非常感谢!哦,我以后会提供一些示例数据的。 - davo1979
最简单的方法是尝试一下。.max()会给你一个Series,其中包含三个最大值,每个值对应不同的度量;.transform(max)会给你一个Series,其中包含六个值,每个值对应原始框架的不同行,正确匹配。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接