首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找数据帧中相同名称的增长

查找数据帧中相同名称的增长
EN

Stack Overflow用户
提问于 2020-11-19 06:57:44
回答 2查看 41关注 0票数 0

我有一个数据集:

代码语言:javascript
复制
Year Name Value
1    A    10
2    B    20
3    A    25
3    B    10

我希望能够找到这些年来每个名字是如何变化的。理想情况下,结果应该如下所示

代码语言:javascript
复制
Name Growth/Year
A    (25-10)/(3-1)
B    (10-20)/(3-2)

我可以首先构建一个唯一名称列表,然后遍历数据集以查找值更改。但是有没有一种简单的方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-19 07:06:32

尝试使用pandas groupby

代码语言:javascript
复制
df = pd.DataFrame({'year':[1,2,3,3], 'name':['A','B','A','B'], 'value':[10,20,25,10]})

df.groupby('name').apply(lambda x: (x['value'].iloc[1]-x['value'].iloc[0])/(x['year'].iloc[1]-x['year'].iloc[0]))

>>>

name
A     7.5
B    -10.0
dtype: float64

或者,为了获得更大的灵活性,您可以定义一个聚合函数:

代码语言:javascript
复制
def value_change(x):
    
    yr1 = min(x['year'])
    yr2 = max(x['year'])
    
    # Get values corresponding to min and max years in case
    # min and max year rows aren't contiguous
    value1 = x[x['year']==yr1]['value'].iloc[0]
    value2 = x[x['year']==yr2]['value'].iloc[0]
    
    return (value2-value1)/(yr2-yr1)

df.groupby('name').apply(value_change)
票数 1
EN

Stack Overflow用户

发布于 2020-11-19 07:19:12

因此,首先您需要与每个名称的第一年和最后一年相对应的行:

代码语言:javascript
复制
df = pd.DataFrame([[1,"A", 10], [2, "B", 20], [3, "A", 25], [3, "B", 10]], columns=["Year", "Name", "Value"])
first_year = df.groupby("Name").Year.idxmin().sort_index()
last_year = df.groupby("Name").Year.idxmax().sort_index()

我添加了sort_index只是为了确保订单排好了队,但测试一下可能是一个好主意,以确保没有任何错误。下面是我测试它的方法:

代码语言:javascript
复制
assert (first_year.index == last_year.index).all()

接下来,您可以使用以下内容来提取所需的值并计算更改:

代码语言:javascript
复制
change_value = (df.loc[last_year.values, "Value"].values - df.loc[first_year.values, "Value"].values)
change_time = (df.loc[last_year.values, "Year"].values - df.loc[first_year.values, "Year"].values)
change_over_time = change_value / change_time

然后,如果您愿意,您可以将其转换为pandas框架:

代码语言:javascript
复制
pd.Series(change_over_time, index=first_year.index)

groupby中可能有一种更整洁的方式来完成这一切,但我认为这种方式更容易理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64902748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档