Как добавить строку с конкретными характеристиками в конец группы? - PullRequest
1 голос
/ 08 мая 2019

Я хочу добавить строку в конце фрейма данных, который можно сгруппировать по переменной.
Мой фрейм данных выглядит так:

|ID | Name1 | Name2 | PointA | PointB | Var1 | Var2 | 
| 1 | AAA   | zzz   | ABC    | BCD    |  1   |  5   | 
| 1 | AAA   | zzz   | BCD    | CDE    |  2   |  5   | 
| 1 | AAA   | zzz   | CDE    | DEF    |  3   |  5   | 
| 2 | BBB   | yyy   | STU    | TUV    |  1   |  6   | 
| 2 | BBB   | yyy   | TUV    | UVW    |  2   |  6   | 
| 2 | BBB   | yyy   | UVW    | VWX    |  3   |  6   | 
| 2 | BBB   | yyy   | VWX    | WXY    |  4   |  6   | 

И что я хочу, это добавить строку в конце каждой категории, как определено ID:

|ID | Name1 | Name2 | PointA | PointB | Var1 | Var2 | 
| 1 | AAA   | zzz   | ABC    | BCD    |  1   |  5   | 
| 1 | AAA   | zzz   | BCD    | CDE    |  2   |  5   | 
| 1 | AAA   | zzz   | CDE    | DEF    |  3   |  5   | 
| 1 | AAA   | zzz   | DEF    | ---    |  4   |  0   | 
| 2 | BBB   | yyy   | STU    | TUV    |  1   |  6   | 
| 2 | BBB   | yyy   | TUV    | UVW    |  2   |  6   | 
| 2 | BBB   | yyy   | UVW    | VWX    |  3   |  6   | 
| 2 | BBB   | yyy   | VWX    | WXY    |  4   |  6   | 
| 2 | BBB   | yyy   | WXY    | ---    |  5   |  0   | 

Я пытался: (мой оригинальный df называется operacionales)

df = pd.DataFrame(columns = operacionales.columns)
val = range(1, 22223)
for x in val:
    test = operacionales.loc[operacionales['ID'] == x]
    li = [test.ID.iloc[0], test.Name1.iloc[0], test.Name2.iloc[0],
test.PointB.iloc[-1], '-', test.Var1.max() + 1, 0]
    t = pd.DataFrame(li).T
    t.columns = test.columns
    test2 = test.append(t)
    df = df.append(test2)

но я получил "IndexError: одиночный позиционный индексатор вышел за пределы" Я попробовал то же самое, но с индексом [-1] вместо [0] в коде, и результат тот же.

Как вы видите, строка, которую я хочу добавить, такая же, как и другие строки группы, за исключением:
1. PointA (которым я хочу быть последним значением переменной PointB),
2. PointB (который я хочу установить в '---'),
3. Var1 (которым я хочу быть +1 от последнего значения в группе) и
4. Point2 (который я хочу установить в 0).

Я нашел это ( добавление строк к объекту групповой работы Pandas ), но это мне не очень помогло.

Буду признателен за любую помощь.

Ответы [ 4 ]

1 голос
/ 08 мая 2019
def update_method(series):
    last_row = series.iloc[-1]
    new_row = last_row
    new_row['PointA'] = last_row['PointA']
    new_row['PointB'] = '---'
    new_row['Var1'] = last_row['Var1']+1
    series = series.append(new_row)
    return series
new_df = df.groupby('Name1').apply(update_method)
0 голосов
/ 09 мая 2019

Вот что я бы сделал:

t = df.groupby('ID', as_index=False).last() 
t[['PointA', 'PointB', 'Var1', 'Var2']] = np.column_stack([t.PointB, ['---']*2, t.Var1+1, [0]*2])
pd.concat([df, t], ignore_index=True).sort_values('ID')

Out[121]:
   ID Name1 Name2 PointA PointB  Var1  Var2
0   1   AAA   zzz    ABC    BCD     1     5
1   1   AAA   zzz    BCD    CDE     2     5
2   1   AAA   zzz    CDE    DEF     3     5
7   1   AAA   zzz    DEF    ---     4     0
3   2   BBB   yyy    STU    TUV     1     6
4   2   BBB   yyy    TUV    UVW     2     6
5   2   BBB   yyy    UVW    VWX     3     6
6   2   BBB   yyy    VWX    WXY     4     6
8   2   BBB   yyy    WXY    ---     5     0
0 голосов
/ 08 мая 2019

Вы можете использовать groupby / apply:

def append_column_to_group(group):
    result = group
    result = result.append({'ID': 1,
                            'Name1': group.iloc[0].Name1,
                            'Name2': group.iloc[0].Name2,
                            'PointA': group.iloc[-1].PointB,
                            'PointB': '---',
                            'Var1': group.iloc[-1].Var1 + 1,
                            'Var2': 0}, ignore_index=True)
    return result
df.groupby('Name1').apply(append_column_to_group)
0 голосов
/ 08 мая 2019

IIUC

appenddf=df.groupby('ID').tail(1)
appenddf=appenddf.drop('PointA',1).rename(columns={'PointB':'PointA'}).assign(Var1=appenddf.Var1+1)
df=pd.concat([df,appenddf],sort=True).sort_index()
df
Out[232]: 
   ID Name1 Name2 PointA PointB  Var1  Var2
0   1   AAA   zzz    ABC    BCD     1     5
1   1   AAA   zzz    BCD    CDE     2     5
2   1   AAA   zzz    CDE    DEF     3     5
2   1   AAA   zzz    DEF    NaN     4     5
3   2   BBB   yyy    STU    TUV     1     6
4   2   BBB   yyy    TUV    UVW     2     6
5   2   BBB   yyy    UVW    VWX     3     6
6   2   BBB   yyy    VWX    WXY     4     6
6   2   BBB   yyy    WXY    NaN     5     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...