我有一个数据集:
Year Name Value
1 A 10
2 B 20
3 A 25
3 B 10我希望能够找到这些年来每个名字是如何变化的。理想情况下,结果应该如下所示
Name Growth/Year
A (25-10)/(3-1)
B (10-20)/(3-2)我可以首先构建一个唯一名称列表,然后遍历数据集以查找值更改。但是有没有一种简单的方法呢?
发布于 2020-11-19 07:06:32
尝试使用pandas groupby
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或者,为了获得更大的灵活性,您可以定义一个聚合函数:
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)发布于 2020-11-19 07:19:12
因此,首先您需要与每个名称的第一年和最后一年相对应的行:
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只是为了确保订单排好了队,但测试一下可能是一个好主意,以确保没有任何错误。下面是我测试它的方法:
assert (first_year.index == last_year.index).all()接下来,您可以使用以下内容来提取所需的值并计算更改:
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框架:
pd.Series(change_over_time, index=first_year.index)在groupby中可能有一种更整洁的方式来完成这一切,但我认为这种方式更容易理解。
https://stackoverflow.com/questions/64902748
复制相似问题