虽然有一些类似的问题,但我无法找到以下简单的答案。请注意,我来自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天才中的一位学习。
答案 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