将每一行除以前一行

sat*_*ato 8 python dataframe pandas

我有熊猫数据框:

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
Run Code Online (Sandbox Code Playgroud)

我想,对于每个城市,将每一行除以前一行并将结果写入一个新的数据帧。所需的输出是:

city ratio
NY   2
LA   3
Run Code Online (Sandbox Code Playgroud)

什么是最pythonic的方式来做到这一点?

jez*_*ael 8

首先除以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
Run Code Online (Sandbox Code Playgroud)

然后删除NaNs 并仅选择cityratio列:

df = df.dropna(subset=['ratio'])[['city', 'ratio']]
print (df)
  city  ratio
1   NY    2.0
3   LA    3.0
Run Code Online (Sandbox Code Playgroud)


lll*_*lll 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)