【问题标题】:pandas merge header rows if one is not NaN如果一个不是 NaN,pandas 合并标题行
【发布时间】:2020-03-28 19:14:47
【问题描述】:

我正在将一个 Excel 表导入数据框,该表的标题分为两行:

Colour | NaN   | Shape | Mass | NaN
NaN    | width | NaN   | NaN  | Torque

green  | 33    | round | 2    | 6
etc

我想将前两行折叠成一个标题:

Colour | width | Shape | Mass | Torque

green  | 33    | round | 2    | 6
...

我试过merged_header = df.loc[0].combine_first(df.loc[1]) 但我不确定如何将其恢复到原始数据框中。

我试过了:

# drop top 2 rows
df = df.drop(df.index[[0,1]])
# then add the merged one in:
res = pd.concat([merged_header, df], axis=0)

但这只是将merged_header 作为一列插入。我从this tutorial 尝试了merge 的其他一些组合,但没有运气。

merged_header.append(df) 给出了类似的错误结果,res = df.append(merged_header) 几乎是正确的,但是表头在尾端:

green  | 33    | round | 2    | 6
...
Colour | width | Shape | Mass | Torque

为了提供更多细节,这是我目前所拥有的:

df = pd.read_excel(ltro19, header=None, skiprows=9)
# delete all empty columns & rows
df = df.dropna(axis = 1, how = 'all')
df = df.dropna(axis = 0, how = 'all')

以防万一影响下一步。

【问题讨论】:

  • 你只有 5 列吗?
  • ('虽然不是通用的快速方法是df = pd.read_excel('filename', skiprows=2, header=None, names=['colour', 'width', 'shape', 'mass', 'torque'])...
  • @JonClements,没有。我有 20 列标题很长,还有许多 excel 表(格式相同,但有其他标题)。这只是一个简化的例子。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

让我们使用列表推导来展平多索引列标题:

df.columns = [f'{j}' if str(i)=='nan' else f'{i}' for i, j in df.columns]

输出:

['Colour', 'width', 'Shape', 'Mass', 'Torque']

【讨论】:

  • df.columns 是 Int64Index([0, 2, 3, 5, 7, 8, 10, 13, 14, 16, 17, 20, 21, 23, 24, 25], dtype='int64'),所以迭代它会导致 TypeError: 'int' object is not iterable
  • 那么你没有 multiIndex 列标题。您只需将数据框的前两行移动到列标题中。
  • 您需要创建将生成输入数据帧的代码。
  • 对不起,我还没有合适的词汇。我不知道什么是 multiIndex 数据框。我所拥有的只是一个格式非常奇怪的 Excel 表格,我正试图将它变成一个更合理的表格。我在哪里可以了解“将行移动到列标题”?谢谢
【解决方案2】:

这应该适合你:

df.columns = list(df.columns.get_level_values(0))

【讨论】:

  • df.columns.get_level_values(0) 返回 Int64Index([0, 2, 3, 5, 7, 8, 10, 13, 14, 16, 17, 20, 21, 23, 24, 25], dtype='int64') 但在其上调用 list 会出现错误 TypeError: 'DataFrame' object is not callable
【解决方案3】:

可能由于我对条款一无所知,上述建议并没有直接引导我找到可行的解决方案。看来我正在使用数据框

>>> print(type(df))
>>> <class 'pandas.core.frame.DataFrame'>

但是,我认为,没有标题。

此解决方案有效,尽管它涉及跳出数据框并进入列表,然后将其作为列标题放回。灵感来自Merging Two Rows (one with a value, the other NaN) in Pandas

df = pd.read_excel(name_of_file, header=None, skiprows=9)
# delete all empty columns & rows
df = df.dropna(axis = 1, how = 'all')
df = df.dropna(axis = 0, how = 'all')

# merge the two headers which are weirdly split over two rows
merged_header = df.loc[0].combine_first(df.loc[1])
# turn that into a list
header_list = merged_header.values.tolist()
# load that list as the new headers for the dataframe
df.columns = header_list
# drop top 2 rows (old split header)
df = df.drop(df.index[[0,1]])

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2017-12-01
    • 2018-06-25
    • 2021-06-19
    • 2021-12-18
    • 2017-03-13
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多