Добавление значений в строку к следующей строке и удаление первой строки в кадре данных pandas - PullRequest
1 голос
/ 08 марта 2019

У меня есть DataFrame, который выглядит примерно так:

        Geo          Age     2010   2011   2012
0      toronto    -1 ~ 7       2      1     5
1      toronto     0 ~ 4       5      3     4
2      toronto     5 ~ 9       4      5     5
3      bc         -1 ~ 7       1      3     2
4      bc          0 ~ 4       2      3     1
5      bc          5 ~ 9       3      1     1
6      mt         -1 ~ 7       4      3     4
7      mt          0 ~ 4       2      2     1
8      mt          5 ~ 9       6      6     6

Я хочу избавиться от -1 ~ 7 строк для каждого города, но хочу добавить значения в 0 ~ 4 строки перед удалением.

Желаемый вывод:

        Geo          Age     2010   2011   2012
1      toronto     0 ~ 4       7      4     9
2      toronto     5 ~ 9       4      5     5
4      bc          0 ~ 4       3      6     3
5      bc          5 ~ 9       3      1     1
7      mt          0 ~ 4       6      5     5
8      mt          5 ~ 9       6      6     6

Не волнует индекс. Я их поменяю.

Спасибо!

Ответы [ 4 ]

1 голос
/ 08 марта 2019

Предполагая, что ваш df упорядочен, вы можете просто использовать комбинацию np.where и shift, а затем фильтровать

import numpy as np
import pandas as pd

df = pd.DataFrame()
df['Geo'] = ['toronto','toronto','toronto']
df['Age'] = ['-1 ~ 7','0 ~ 4','5 ~ 9']
df['2010'] = [2,5,4]


df['2010'] = np.where(df['Age']=='0 ~ 4',df['2010']+df['2010'].shift(1),df['2010'])
df = df[~(df['Age']=='-1 ~ 7')]
display(df)

    Geo     Age     2010
1   toronto 0 ~ 4   7.0
2   toronto 5 ~ 9   4.0
0 голосов
/ 08 марта 2019

Давайте попробуем так:

age_ind = df.index[df['Age'] == '0~4'].tolist()

for i in age_ind:
    df.at[i,['2010', '2011', '2012']]  = (df.at[i,"2010"]+df.at[i-1,"2010"]),(df.at[i,"2011"]+df.at[i-1,"2011"]),(df.at[i,"2012"]+df.at[i-1,"2012"])

df.drop(df[df.Age == '-1~7'].index)

Выход:

    Geo       Age     2010  2011 2012
1   toronto     0~4     7   4   9
2   toronto     5~9     4   5   5
4   bc          0~4     3   6   3
5   bc          5~9     3   1   1
7   mt          0~4     6   5   5
8   mt          5~9     6   6   6
0 голосов
/ 08 марта 2019

Если вы хотите удалить данные на основе значения, просто отфильтровав фрейм данных.

new_df = df[df.Age != '-1 ~ 7']
new_df
0 голосов
/ 08 марта 2019

Создайте ключ справки здесь

s=df.Age=='5 ~ 9'
yourdf=df.groupby([df.Geo,s]).agg({'Age':'last','2010':'sum','2011':'sum','2012':'sum'})
yourdf
                 Age  2010  2011  2012
Geo     Age                           
bc      False  0 ~ 4     3     6     3
        True   5 ~ 9     3     1     1
mt      False  0 ~ 4     6     5     5
        True   5 ~ 9     6     6     6
toronto False  0 ~ 4     7     4     9
        True   5 ~ 9     4     5     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...