首页 > 解决方案 > 转置 Excel 表格的第一列,删除空单元格并将其附加到特定行

问题描述

我有一个来自 Excel 文件的数据集,如下所示:

     0         1         2      3    ...
1   NaN       NaN       V001   V002
2   NaN       NaN       Total  Total
3   NaN       NaN       EUR    EUR
4   NaN       NaN       Text   Text
5   NaN       NaN       Text   Text
6   NaN       NaN       Text   Text
7   NaN       NaN       Text   Text
8   NaN       NaN       Text   Text
9   NaN       NaN       Text   Text
10  NaN       NaN       Text   Text
11  U1        Totalprod Text   Text
12  U2        7000      5000   3000
...

我只需要从 A 列中删除 NaN,然后​​将其转置为一行并将其粘贴到第 8 行,然后表格将向下移动一行。它应该看起来像这样的结果:

     0         1     2     3   ...
1   NaN       V001  V002  V003
2   NaN       Total Total Total
3   NaN       EUR   EUR   EUR
4   NaN       NaN   Text  Text
5   NaN       NaN   Text  Text
6   NaN       NaN   Text  Text
7   NaN       NaN   Text  Text
8   NaN       U1    U2    U3
9   NaN       NaN   Text  Text
10  NaN       NaN   Text  Text
11  NaN       NaN   Text  Text
12  Totalprod 7000  5000  3000
13  3232      3223  999   3000
...

如何使用 Python 和 Pandas 库实现这一点?

在此处输入图像描述

标签: pythonpandas

解决方案


  • 系统地编码你描述和展示的内容
  • 获取您想要的值作为第 8 行
  • 删除并重命名左侧的列
  • 将三个部分连接在一起
import io

df = pd.read_csv(
    io.StringIO("""     A         B         C      D
1   NaN       NaN       V001   V002
2   NaN       NaN       Total  Total
3   NaN       NaN       EUR    EUR
4   NaN       NaN       Text   Text
5   NaN       NaN       Text   Text
6   NaN       NaN       Text   Text
7   NaN       NaN       Text   Text
8   NaN       NaN       Text   Text
9   NaN       NaN       Text   Text
10  NaN       NaN       Text   Text
11  U1        Totalprod Text   Text
12  U2        7000      5000   3000"""),sep="\s+",)

# get values that will become row
s_a = df["A"].dropna()
# drop unwanted column A and rename columns A to Z
df = df.drop(columns="A").pipe(
    lambda d: d.rename(columns={c: df.columns[i] for i, c in enumerate(d.columns)})
)

# concat all parts together
df = pd.concat(
    [
        df.loc[0:8],
        pd.DataFrame(
            np.array([s_a.values]),
            columns=[
                f"{'' if (c//26)==0 else chr((c//26)+64)}{chr((c%26)+65)}"
                for c in range(len(s_a))
            ],
        ),
        df.loc[9:],
    ]
).reset_index(drop=True)

df

一种 C
0 V001 V002
1 全部的 全部的
2 欧元 欧元
3 文本 文本
4 文本 文本
5 文本 文本
6 文本 文本
7 文本 文本
8 U1 U2
9 文本 文本
10 文本 文本
11 全产品 文本 文本
12 7000 5000 3000

推荐阅读