Python 遍历DataFrame行以创建新列,同时引用其他行
我有一个大型数据框架,其中包含股票的基本数据。下面是数据帧(数据)的头部和尾部的图像。它拥有2005-2015年期间每种证券和每年的数据。请注意“calendardate”列 我的目标是到每一行,取“revenueusd”数据点,然后除以前一年的“revenueusd”数据点,得到每种证券1年的收入增长变化。第二个数据点使用ticker和calendardate进行定位 我一直在尝试对lambda使用apply函数,但它不起作用。下面是我一直在尝试的代码:Python 遍历DataFrame行以创建新列,同时引用其他行,python,pandas,Python,Pandas,我有一个大型数据框架,其中包含股票的基本数据。下面是数据帧(数据)的头部和尾部的图像。它拥有2005-2015年期间每种证券和每年的数据。请注意“calendardate”列 我的目标是到每一行,取“revenueusd”数据点,然后除以前一年的“revenueusd”数据点,得到每种证券1年的收入增长变化。第二个数据点使用ticker和calendardate进行定位 我一直在尝试对lambda使用apply函数,但它不起作用。下面是我一直在尝试的代码: def conversion(tick
def conversion(tick, dates,dataframe):
date1 = datetime.datetime.strptime(dates, "%Y-%m-%d").date()
date2 = datetime.date(date1.year-1,date1.month,date1.day).strftime("%Y-%m-%d")
growth = dataframe[(dataframe['ticker']==tick)&(dataframe['calendardate']==dates)]['revenueusd']/dataframe[(dataframe['ticker']==tick)&(dataframe['calendardate']==date2)]['revenueusd']-1
return growth
data['1yrRevenueGrowth']=data.apply(lambda x: conversion(x['ticker'],x['calendardate'],data),axis=1)
我已经被困在这几天和搜索论坛无情。任何帮助都将不胜感激
有一个很好的函数为您调用。例如,您可以这样做:
import pandas as pd
data = pd.read_csv("data.csv", index_col=0)
data.groupby("ticker").apply(lambda x : x.set_index("calendardate").sort_index()["revenueusd"].pct_change())
data["calendardate"] = pd.to_datetime(data["calendardate"], infer_datetime_format=True)
对于每个ticker值,将构造一个按日历日期排序的序列,然后应用函数pct_change
(默认情况下,该函数计算两个连续条目之间的比率)
还有一件事,您的日期格式很好,因此您可以轻松地将列转换为datetime类型,如下所示:
import pandas as pd
data = pd.read_csv("data.csv", index_col=0)
data.groupby("ticker").apply(lambda x : x.set_index("calendardate").sort_index()["revenueusd"].pct_change())
data["calendardate"] = pd.to_datetime(data["calendardate"], infer_datetime_format=True)
从这一点开始:
ticker ticker.1 calendardate revenueusd gp rnd
0 A A 2015-12-31 4038000000 2041000000 330000000
1 AA AA 2015-12-31 22534000000 4465000000 238000000
2 A A 2014-12-31 403800000 204100000 330000000
3 AA AA 2014-12-31 2253400000 446500000 238000000
4 A A 2013-12-31 403800000 20410000 330000000
5 AA AA 2013-12-31 225340000 44650000 238000000
6 A A 2012-12-31 403800 2041000 330000000
7 AA AA 2012-12-31 22534000 4465000 238000000
df["pct"] = df.groupby("ticker")['revenueusd'].pct_change()
ticker ticker.1 calendardate revenueusd gp rnd pct
0 A A 2015-12-31 4038000000 2041000000 330000000 NaN
1 AA AA 2015-12-31 22534000000 4465000000 238000000 NaN
2 A A 2014-12-31 403800000 204100000 330000000 -0.900
3 AA AA 2014-12-31 2253400000 446500000 238000000 -0.900
4 A A 2013-12-31 403800000 20410000 330000000 0.000
5 AA AA 2013-12-31 225340000 44650000 238000000 -0.900
6 A A 2012-12-31 403800 2041000 330000000 -0.999
7 AA AA 2012-12-31 22534000 4465000 238000000 -0.900
在应用groupby之前,您可能需要对数据帧进行排序 请在你的问题文本中加入你的数据样本,而不是链接到图像。这样做的最佳方式是什么?我试着把它写进课文里,它看起来很潦草。谢谢你的帮助!不知道你的意思。只需复制并粘贴数据帧的一部分,并使用StackOverflow编辑器中的格式化工具对其进行格式化,就像它是代码一样。最好包含生成数据的代码,或者以类似CSV的格式包含数据片段,以便其他人自己剪切、粘贴和加载。感谢您的提示。我已经在CSV格式的文本中添加了一个数据示例。让我知道这是否是您的想法。也许
.apply(lambda x:x.pct_change())
与.pct_change()
相同?