我想在可以由变量分组的数据帧末尾添加一行。
我的数据框如下所示:
|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)。
我发现了这个(append rows to a Pandas groupby object),但并没有真正帮助我。
任何帮助将不胜感激。
答案 0 :(得分:1)
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)
答案 1 :(得分:0)
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
答案 2 :(得分:0)
您可以使用groupby /应用:
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)
答案 3 :(得分: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