【发布时间】:2019-06-13 14:42:51
【问题描述】:
我正在使用示例数据集:
date name point
0 4/24/2019 Martha 3617138
1 4/25/2019 Martha 3961918
2 4/26/2019 Martha 4774966
3 4/27/2019 Martha 5217946
4 4/24/2019 Alex 62700321
5 4/25/2019 Alex 66721020
6 4/26/2019 Alex 71745138
7 4/27/2019 Alex 88762943
8 4/28/2019 Alex 102772578
9 4/29/2019 Alex 129089274
10 3/1/2019 Josh 1063259
11 3/3/2019 Josh 1063259
12 3/4/2019 Josh 1063259
13 3/5/2019 Josh 1063259
14 3/6/2019 Josh 1063259
以及名称值列表
nameslist = ['Martha', 'Alex', 'Josh']
我想根据名称列中的标识符计算所有行的百分比变化。
预期输出:
name percent change
Martha 30.7
Alex 51.4
Josh 0
我最初尝试遍历我的列表和表格,并添加与列表值匹配的所有行,附加一个带有更改计算的列表,然后移动我的列表的下一个值,但我无法表达我的正确编码以实现这一目标。
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by='date')
growthlist=[]
temptable=[]
for i in nameslist:
for j in df:
temptable.append(df[df['name'].str.match(nameslist[i])])
length=[]
growth=temptable[0]-temptable[length-1]
growthlist.append(i,growth)
但这会产生错误:
TypeError: list indices must be integers or slices, not str
我也不介意使用 .groupby() 和 .pct_change() 来实现这个目标,但是
growth = df.groupby('name').pct_change()
生成一个以以下结尾的长回溯:
TypeError: unsupported operand type(s) for /: 'str' and 'float'
最后,我想将它嵌套在一个函数中,这样我就可以在其他数据集上使用它并能够选择我的列名(我正在使用的实际数据集没有标准化,因此目标列名通常不同)
def calc_growth(dataset,colname):
但我不确定这个问题是否太过分了。
不幸的是,我对这个问题很迷茫,所以任何帮助都将不胜感激。我也想知道转换是否是一种更简单的方法,因为至少我总是知道我需要计算的两个数字的确切位置,但我什至不知道我将如何开始这样的事情。
谢谢
【问题讨论】:
-
df.groupby('name').point.pct_change()? -
你能详细说明你是如何聚合的吗?
-
@QuangHoang 如果真的那么容易,我会很沮丧。在我的实际数据集中,计算增长的列实际上是“l.row_cnt”,那么我该如何重新格式化来测试呢?
-
@yatu 我不确定我是否理解你的问题。 “如何”我正在聚合使用“growth = df.groupby('name').pct_change()”,但我不确定如何扩展命令以实际计算 'point' 列中的变化(col我的实际数据集中的名称是'l.row_cnt')
-
我第二个@yatu,你能解释一下你的预期输出吗?
标签: python pandas dataframe pandas-groupby