У меня есть фреймворк:
Name y1 y2 y3
1 Ben 01 02 03
2 Jane 04 05 06
3 Sarah 07 07 06
Я пытаюсь добавить строку в свой фрейм данных, которая предоставляет общее количество строк в каждом столбце. Мой код:
import pandas as pd
df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], axis=0))
df.set_value(0, 0,'total')
df.head()
Это успешно, но также удаляет имена моих столбцов следующим образом:
0 1 2 3
0 Total 12 14 15
1 Ben 01 02 03
2 Jane 04 05 06
3 Sarah 07 07 06
вместо того, чтобы возвращать это по желанию:
Name y1 y2 y3
0 Total 12 14 15
1 Ben 01 02 03
2 Jane 04 05 06
3 Sarah 07 07 06
Я пробовал вставить
Index(['Name'], name=df.index.name)
к
df = pd.DataFrame(np.insert(df.values, 0, values=[df.sum(axis=0)], Index(['Name'], name=df.index.name) axis=0))
но это просто возвращает ошибку
TypeError: unhashable type: 'Index'
Где я ошибаюсь?
Мечта о каждом ОП - много идеальных ответов :)






Вы можете использовать pandas.concat для объединения двух фреймов данных:
import pandas as pd
df = ...
df_total = pd.DataFrame(df.iloc[:, 1:].sum(), columns=["Total"]).T.reset_index()
df_total.columns = df.columns
df = pd.concat([df_total, df])
# Name y1 y2 y3
# 0 Total 12 14 15
# 1 Ben 1 2 3
# 2 Jane 4 5 6
# 3 Sarah 7 7 6
Один из способов избежать этого - добавить новую строку через .loc, а затем переместить ее наверх:
df.loc[len(df)+1] = ['Total'] + df.iloc[:, 1:].sum(axis=0).tolist()
df = df.loc[[df.index[-1]] + df.index[:-1].tolist(), :]
# Name y1 y2 y3
# 4 Total 12 14 15
# 1 Ben 1 2 3
# 2 Jane 4 5 6
# 3 Sarah 7 7 6
Вы можете использовать df.reset_index после этого, если это важно для вас.
IIUC, вы можете сделать это следующим образом, используя select_types, assign и pd.concat:
pd.concat([df.select_dtypes(include=np.number)
.sum()
.to_frame()
.T
.assign(Name='Total'),df])
Выход:
Name y1 y2 y3
0 Total 12 14 15
1 Ben 1 2 3
2 Jane 4 5 6
3 Sarah 7 7 6
Можешь попробовать
s=df.sum()
s.loc['Name']='Total'
df.loc[0]=s
df.sort_index()
Out[457]:
Name y1 y2 y3
0 Total 12 14 15
1 Ben 1 2 3
2 Jane 4 5 6
3 Sarah 7 7 6
Решение с np.insert должно быть очень быстрым, но необходимо сначала создать index с нечисловыми столбцами:
#create index from `Name` column
df = df.set_index('Name')
#add first value to index
idx = np.insert(df.index, 0, 'Total')
#add columns and index parameters to DataFrame contructor and last reset index
df = pd.DataFrame(np.insert(df.values, 0, df.sum(), axis=0),
columns=df.columns,
index=idx).reset_index()
print (df)
Name y1 y2 y3
0 Total 12 14 15
1 Ben 1 2 3
2 Jane 4 5 6
3 Sarah 7 7 6
Это отлично сработало и на гораздо большем наборе данных. Я также заменил .mean на .sum, что может быть полезно другим, желающим сделать то же самое. idx = np.insert (df.index, 0, 'Среднее') df = pd.DataFrame (np.insert (df.values, 0, df.mean (), axis = 0),