【问题标题】:Pandas combining rows as header info熊猫将行组合为标题信息
【发布时间】:2022-01-01 04:40:44
【问题描述】:

这就是我使用 pandas 读取和创建数据框的方式

def get_sheet_data(sheet_name='SomeName'):
    df = pd.read_excel(f'{full_q_name}',
                       sheet_name=sheet_name,
                       header=[0,1],
                       index_col=0)#.fillna(method='ffill')
    df = df.swapaxes(axis1="index", axis2="columns")
    return df.set_index('Product Code')

打印这个表格给了我(这可能会有数百列):

我似乎无法将前两行添加到标题中,我试过了:

python:pandas - How to combine first two rows of pandas dataframe to dataframe header?

https://stackoverflow.com/questions/59837241/combine-first-row-and-header-with-pandas

我在每一点都失败了。我认为是因为多索引,不一定是轴交换?但是使用:

https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.html

现在有点让我头疼。请帮我将这两行添加到标题中?

df.columns 的输出量很大,所以我把它削减了很多:

Index(['Product Code','Product Narrative\nHigh-level service description','Product Name','Huawei Product ID','Type','Bill Cycle Alignment',nan,'Stackable',nan,

并以:

结尾
nan], dtype='object')

【问题讨论】:

  • 请发布 df.columns 的输出,并尝试复制粘贴数据框至少几行而不是发布图片?
  • 我希望它足够达斯巴巴

标签: python-3.x pandas dataframe multi-index


【解决方案1】:

我们创建新的列名并将它们设置为 df.columns,新的列名是通过连接 3 个 Multindex 标题和 DataFrame 的第一行来生成的。

df.columns = ['_'.join(i) for i in zip(df.columns.get_level_values(0).tolist(), df.columns.get_level_values(1).tolist(), df.iloc[0,:].replace(np.nan,'').tolist())]

【讨论】:

  • 我之前尝试过类似的东西:df.columns = (df.columns.get_level_values(1)[:3].tolist() + df.columns.get_level_values(2)[3:].tolist ()) ... 但是在上面的示例中,我得到的错误是:IndexError: Too many levels: Index has only 1 level, not 2
  • 如果错误提示索引只有 1 个级别,那么 .get_level_values(0) 和 .get_level_values(1) 应该可以工作,请参阅更新后的答案
  • 不幸的是,我得到了同样的错误 darth -->df = df.swapaxes(axis1="index", axis2="columns") 导致错误,如果我注释掉进程的行但显然我的数据显示不正确。如果我用上面的索引替换列所以df.index.get_level_values(0).tolist(),我得到一个长度不匹配的错误:预期轴有63个元素,新值有33个元素
  • 此类型错误是因为列中有 nan,将其替换为任何 str 或将 float NaN 转换为字符串,然后重试它应该可以工作
  • 我只是添加了df.columns = df.columns.astype(str),然后是您的行df.columns = ['_'.join(i) for i in zip(df.columns, df.iloc[0, :].replace(np.nan, '').tolist())],我将按预期返回列名:) 谢谢达斯巴巴
猜你喜欢
  • 2020-05-07
  • 2023-02-21
  • 2022-12-06
  • 2020-10-26
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多