在Pandas datafram中计算新列

2024-04-27 22:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

虽然有一些类似的问题,但我找不到一个直截了当的答案。注意,我来自R,对熊猫还很陌生。

假设我有一个Pandas数据框df,它包含两列:“measure”(3级unicode)和“Airquality”(numpy.float64)。

我想创建一个名为“color”的第三列,它基于“Airquality”中的值。此外,我想为每个级别的“度量”分别执行此操作。我成功地使用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天才之一学习。


Tags: the数据inpandasdffor度量value
2条回答

我认为您可以使用^{}工具,特别是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

这是因为我们通过对measure列进行分组,为每个不同的measure值找到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

我不是天才,但我喜欢熊猫。用法,即:

df['newcol'] = df.apply(lambda row: row['firstcolval'] * row['secondcolval'], axis=1)

文档中的更多信息与往常一样:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

相关问题 更多 >