将每一行除以前一行

时间:2018-05-28 09:40:43

标签: python pandas dataframe

我有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

最蟒蛇的方式是什么?

5 个答案:

答案 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并仅选择cityratio列:

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