计算Pandas数据帧中的新列

时间:2017-01-25 01:57:40

标签: python pandas

虽然有一些类似的问题,但我无法找到以下简单的答案。请注意,我来自R,对熊猫来说很新。

假设我有一个包含两列的Pandas数据帧df:" measure" (3级unicode)和#34; Airquality" (numpy.float64)。

我想创建一个名为" color"的第三列,它基于" Airquality"中的值。此外,我想对每个级别的"测量"单独执行此操作。我已成功将df分成"测量"使用df.loc。然后我计算了#34;颜色"使用以下代码分别在每个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天才中的一位学习。

2 个答案:

答案 0 :(得分:9)

我不是天才,但我会和熊猫apply一起去。用法即如此:

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

照常在文档中提供更多信息:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

答案 1 :(得分:3)

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