【问题标题】:How to insert a header multiple times in a pandas dataframe如何在熊猫数据框中多次插入标题
【发布时间】:2019-10-05 14:57:07
【问题描述】:

我昨天问了这个问题,但有几件事不清楚,所以我在这里重新发布。基本上我有一个 13 列和超过 500 行的数据框,我试图每 x 行添加一个标题。

我是初学者,所以我尝试过 .concat 和 .append 但我不确定我是否真的做对了

我有变量 header = ['Rk', 'Player', 'Age',...]

In: print(final.head())

out:
   index            Player Age   Tm Pos  GP   G   A    P +/- PPP    TOI
0      0   Nikita Kucherov  25  TBL  RW  82  41  87  128  24  41  19:58
1      4     Brad Marchand  30  BOS  LW  79  36  64  100  15  33  19:37
2      5     Sidney Crosby  31  PIT   C  79  35  65  100  18  20  21:00
3      6  Nathan MacKinnon  23  COL   C  82  41  58   99  20  31  22:05
4      7   Johnny Gaudreau  25  CGY  LW  82  36  63   99  18  29  20:04

我想每 48 行打印一次标题,如果我想每 2 行打印一次,它看起来像这样:

In: print(final.head())

out:
   index            Player Age   Tm Pos  GP   G   A    P +/- PPP    TOI
0      0   Nikita Kucherov  25  TBL  RW  82  41  87  128  24  41  19:58
1      4     Brad Marchand  30  BOS  LW  79  36  64  100  15  33  19:37
                    Player Age   Tm  Pos GP   G   A    P  +/- PPP   TOI
2      5     Sidney Crosby  31  PIT   C  79  35  65  100  18  20  21:00
3      6  Nathan MacKinnon  23  COL   C  82  41  58   99  20  31  22:05
                    Player Age   Tm  Pos GP   G   A    P  +/- PPP   TOI
4      7   Johnny Gaudreau  25  CGY  LW  82  36  63   99  18  29  20:04

请注意,当我多次插入时,我并不真正关心标题行的索引列的值是什么,我对此部分非常宽容。

【问题讨论】:

  • 嗯,这是什么原因?因为只能像行一样添加标题,所以得到与字符串混合的数值。因此无法对数字数据进行下一步处理。
  • 这只是为了显示目的吗?正如 jezrael 所提到的,混合数据类型将无法进行某些操作。

标签: python pandas


【解决方案1】:

这是可能的,但如果以后需要处理数据,不推荐,因为如果将数字值与字符串混合,某些函数会失败:

N = 2
#N = 48 with real data
#get index of added values, omit first value
idx = df.index[::N][1:]
#repeat columns to DataFrame
arr = np.broadcast_to(df.columns, (len(idx),len(df.columns)))
df1 = pd.DataFrame(arr, index=idx, columns=df.columns)

#append original and sorting by index
df = df1.append(df).sort_index().reset_index(drop=True)
print (df)
   index            Player  Age   Tm  Pos  GP   G   A    P  +/-  PPP    TOI
0      0   Nikita Kucherov   25  TBL   RW  82  41  87  128   24   41  19:58
1      4     Brad Marchand   30  BOS   LW  79  36  64  100   15   33  19:37
2  index            Player  Age   Tm  Pos  GP   G   A    P  +/-  PPP    TOI
3      5     Sidney Crosby   31  PIT    C  79  35  65  100   18   20  21:00
4      6  Nathan MacKinnon   23  COL    C  82  41  58   99   20   31  22:05
5  index            Player  Age   Tm  Pos  GP   G   A    P  +/-  PPP    TOI
6      7   Johnny Gaudreau   25  CGY   LW  82  36  63   99   18   29  20:04

编辑要将每个拆分的 DataFrame 写入一个 Excel 文件中的单独工作表,请使用:

N = 2
#N = 48 with real data
with pd.ExcelWriter('file.xlsx') as writer:
    for i, df1 in enumerate(np.split(df, range(N, len(df), N))):
        df1.to_excel(writer, sheet_name=f'Sheet{i}', index=False)

EDIT1:将所有 DataFrame 写入相同的工作表名称:

#https://stackoverflow.com/a/33004253  + added index=False to df.to_excel
def multiple_dfs(df_list, sheets, file_name, spaces):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    row = 0
    for dataframe in df_list:
        dataframe.to_excel(writer,sheet_name=sheets,startrow=row ,startcol=0, index=False)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

N = 2
#N = 48 with real data
dfs = np.split(df, range(N, len(df), N))
multiple_dfs(dfs, 'Steetname1', 'file.xlsx', 1)

【讨论】:

  • 这非常接近,唯一的问题是我的 n 值将是 48(或者至少我认为应该是这样)。当我将此数据框导出到 excel 时,excel 在打印时每页可以容纳 48 行。我希望这一行成为每一页的第一行。
  • @JackB 所以你需要将每个标题写入单独的工作表吗?每个excel表有48行带标题?
  • 是的,当我在 Excel 中打印数据框时,我希望这个标题位于每一页的顶部
  • @JackB - 已编辑答案。
  • 这更接近了,只是我希望它们都在同一张纸上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多