我有pandas dataframe:
df = pd.DataFrame()
df['city'] = ['NY','NY','LA','LA']
df['hour'] = ['0','12','0','12']
df['value'] = [12,24,3,9]
city hour value
0 NY 0 12
1 NY 12 24
2 LA 0 3
3 LA 12 9
对于每个城市,我希望将每一行除以前一行,并将结果写入新的数据帧。所需的输出是:
city ratio
NY 2
LA 3
最蟒蛇的方式是什么?
答案 0 :(得分:2)
您可以使用pct_change:
In [20]: df[['city']].assign(ratio=df.groupby('city').value.pct_change().add(1)).dropna()
Out[20]:
city ratio
1 NY 2.0
3 LA 3.0
答案 1 :(得分:2)
首先除以每组shift
个ed值:
df['ratio'] = df['value'].div(df.groupby('city')['value'].shift(1))
print (df)
city hour value ratio
0 NY 0 12 NaN
1 NY 12 24 2.0
2 LA 0 3 NaN
3 LA 12 9 3.0
然后移除NaN
并仅选择city
和ratio
列:
df = df.dropna(subset=['ratio'])[['city', 'ratio']]
print (df)
city ratio
1 NY 2.0
3 LA 3.0
答案 2 :(得分:1)
一种方法是,
df.groupby(['city']).apply(lambda x:x['value']/x['value'].shift(1))
进一步改进,
print df.groupby(['city']).apply(lambda x:(x['value']/x['value'].shift(1)).fillna(method='bfill'))).reset_index().drop_duplicates(subset=['city']).drop('level_1',axis=1)
city value
0 LA 3.0
2 NY 2.0
答案 3 :(得分:1)
这样做:
df.groupby('city')['value'].agg({'ratio': lambda x: x.max()/x.min()}).reset_index()
# city ratio
#0 LA 3
#1 NY 2
答案 4 :(得分:1)
这是使用自定义功能的一种方式。它假设您要忽略将一个系列除以其自身的移位版本的结果中的NaN
行。
def divider(x):
return x['value'] / x['value'].shift(1)
res = df.groupby('city').apply(divider)\
.dropna().reset_index()\
.rename(columns={'value': 'ratio'})\
.loc[:, ['city', 'ratio']]
print(res)
city ratio
0 LA 3.0
1 NY 2.0