遍历DataFrame行以创建新列,同时引用其他行

2024-09-28 05:18:25 发布

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

我有一个很大的数据框架,其中包含股票的基本数据。下面是数据帧(data)的头部和尾部的图像。它拥有2005-2015年期间每种证券和每年的数据。请注意“calendardate”列。你知道吗

我的目标是到每一行,取'revenueusd'数据点,除以前一年的'revenueusd'数据点,得到每种证券1年的收入增长变化。第二个数据点使用ticker和calendardate进行定位。你知道吗

我一直在尝试将apply函数用于lambda,但它不起作用。下面是我一直在尝试的代码:

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)

我已经被困在这几天和搜索论坛无情。任何帮助都将不胜感激!你知道吗

data.head(5)

data.tail(5)

,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,AAL,AAL,2015-12-31,40990000000,23911000000,0  
3,AAP,AAP,2015-12-31,9737018000,4422772000,0  
4,AAPL,AAPL,2015-12-31,234988000000,94308000000,8576000000  
5,ABBV,ABBV,2015-12-31,22859000000,18359000000,4435000000  
509,A,A,2014-12-31,6981000000,3593000000,719000000  
510,AA,AA,2014-12-31,23906000000,4769000000,218000000  
511,AAPL,AAPL,2014-12-31,199800000000,78432000000,6606000000  
512,ABBV,ABBV,2014-12-31,19960000000,15534000000,3649000000 

Tags: 数据dataframedatadatetimeaa证券tickerdates
2条回答

从这个开始:

 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之前,您可能需要对数据帧进行排序。你知道吗

有一个很好的函数叫做Series.pct_change。你可以这样做:

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())

对于每个ticker值,构造一个按日历日期排序的序列,然后应用函数pct_change(默认情况下,此函数计算两个连续条目之间的比率)。你知道吗

ticker  calendardate
A       2014-12-31           NaN
        2015-12-31     -0.421573
AA      2014-12-31           NaN
        2015-12-31     -0.057391
AAL     2015-12-31           NaN
AAP     2015-12-31           NaN
AAPL    2014-12-31           NaN
        2015-12-31      0.176116
ABBV    2014-12-31           NaN
        2015-12-31      0.145240
Name: revenueusd, dtype: float64

还有一件事,您的日期格式很好,因此您可以轻松地将列转换为datetime类型,如下所示:

data["calendardate"] = pd.to_datetime(data["calendardate"], infer_datetime_format=True)

相关问题 更多 >

    热门问题