Python 如何将具有特定特征的行附加到组的末尾?

Python 如何将具有特定特征的行附加到组的末尾?,python,pandas,append,row,Python,Pandas,Append,Row,我想在数据帧的末尾追加一行,该行可以通过变量分组 我的数据框如下所示: |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

我想在数据帧的末尾追加一行,该行可以通过变量分组
我的数据框如下所示:

|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=范围(12223)
对于val中的x:
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)
但我得到了一个“索引器:单位置索引器超出范围” 我尝试了同样的方法,但是使用了索引
[-1]
而不是代码中的
[0]
,结果是一样的

如您所见,我要添加的行与组中的其他行相同,只是:
1.
PointA
(我希望它是
PointB
变量的最后一个值),
2. <代码>点B(我想将其设置为'--'),
3.
Var1
(我希望它是组中最后一个值的+1)和
4. <代码>点2(我想设置为0)

我找到了这个()但它对我没有什么帮助

任何帮助都将不胜感激。

IIUC

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)

您可以使用groupby/apply:

def将列添加到组(组):
结果=组
result=result.append({'ID':1,
“Name1”:group.iloc[0]。Name1,
“Name2”:group.iloc[0]。Name2,
“PointA”:group.iloc[-1]。PointB,
'点B':'--',
“Var1”:group.iloc[-1].Var1+1,
“Var2”:0},忽略_index=True)
返回结果
df.groupby('Name1')。应用(将列添加到组)

以下是我要做的:

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

这正是我需要的!多谢各位。
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