Разделив каждый ряд на предыдущий - PullRequest
0 голосов
/ 28 мая 2018

У меня есть 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 голосов
/ 28 мая 2018

Сначала разделите на 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 s и выберите только столбцы city и ratio:

df = df.dropna(subset=['ratio'])[['city', 'ratio']]
print (df)
  city  ratio
1   NY    2.0
3   LA    3.0
0 голосов
/ 28 мая 2018

Это один из способов использования пользовательской функции.Предполагается, что вы хотите игнорировать строки 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
0 голосов
/ 28 мая 2018

Вы можете использовать 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
0 голосов
/ 28 мая 2018

Это будет сделано:

df.groupby('city')['value'].agg({'ratio': lambda x: x.max()/x.min()}).reset_index()
#  city  ratio
#0   LA      3
#1   NY      2
0 голосов
/ 28 мая 2018

в одну сторону,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...