使用Python Pandas DataFrame将行值转换为列值

2 投票
1 回答
44 浏览
提问于 2025-04-13 17:14

将数据框中某一列的值进行分组后,合并列和行的值,并把结果赋值给一个新列。

下面的代码试图实现预期的结果,但运行时间比较长。

代码:

groups = df.groupby("row_number")
df_new = groups.apply(func).droplevel(0)


def func(g: pd.DataFrame) -> pd.DataFrame:
    first_row_of_group = g.iloc[0]
    g = g.iloc[1:, :]
    cols = range(1, len(first_row_of_group))

    for i in cols:
        g["structure_data"] = (
                g["structure_data"]
                + str(first_row_of_group.iloc[i])
                + "="
                + g.iloc[:, i].apply(try_round)
                + ";"
        )

    return g

数据框:

列 A 列 B 列 C 列 D 列 E 结构数据
A 0D 1D 7D 14D
A 0.03891 0.0410 0.0417 0.0435
A 0.03891 0.0410 0.0417 0.0435
A 0.03891 0.0410 0.0417 0.0435
A 0.03891 0.0410 0.0417 0.0435

结构数据列中的预期值:

列 A 列 B 列 C 列 D 列 E 结构数据
A 0.03891 0.0410 0.0417 0.0435 0D=0.03891;1D=0.0410;7D=0.0417;14D=0.0435
A 0.03891 0.0410 0.0417 0.0435 0D=0.03891;1D=0.0410;7D=0.0417;14D=0.0435
A 0.03891 0.0410 0.0417 0.0435 0D=0.03891;1D=0.0410;7D=0.0417;14D=0.0435
A 0.03891 0.0410 0.0417 0.0435 0D=0.03891;1D=0.0410;7D=0.0417;14D=0.0435

1 个回答

0

如果你有这个数据表:

  Column A Column B Column C Column D Column E  structure_data
0        A       0D       1D       7D      14D             NaN
1        A  0.03891   0.0411   0.0417   0.0435             NaN
2        A  0.03891   0.0412   0.0417   0.0435             NaN
3        A  0.03891   0.0413   0.0417   0.0435             NaN
4        A  0.03891   0.0414   0.0417   0.0435             NaN
5        B       0D       1D       7D      14D             NaN
6        B  0.03891   0.0415   0.0417   0.0435             NaN
7        B  0.03891   0.0416   0.0417   0.0435             NaN
8        B  0.03891   0.0417   0.0417   0.0435             NaN
9        B  0.03891   0.0418   0.0417   0.0435             NaN

那么你可以试试:

def fn(g):
    r = g.iloc[0]
    g = g.iloc[1:].copy()
    g["structure_data"] = g.apply(
        lambda x: ";".join("=".join(map(str, t)) for t in zip(r[:-1], x[:-1])), axis=1
    )
    return g


out = df.groupby("Column A").apply(fn, include_groups=False).droplevel(-1).reset_index()
print(out)

这会输出:

  Column A Column B Column C Column D Column E                             structure_data
0        A  0.03891   0.0411   0.0417   0.0435  0D=0.03891;1D=0.0411;7D=0.0417;14D=0.0435
1        A  0.03891   0.0412   0.0417   0.0435  0D=0.03891;1D=0.0412;7D=0.0417;14D=0.0435
2        A  0.03891   0.0413   0.0417   0.0435  0D=0.03891;1D=0.0413;7D=0.0417;14D=0.0435
3        A  0.03891   0.0414   0.0417   0.0435  0D=0.03891;1D=0.0414;7D=0.0417;14D=0.0435
4        B  0.03891   0.0415   0.0417   0.0435  0D=0.03891;1D=0.0415;7D=0.0417;14D=0.0435
5        B  0.03891   0.0416   0.0417   0.0435  0D=0.03891;1D=0.0416;7D=0.0417;14D=0.0435
6        B  0.03891   0.0417   0.0417   0.0435  0D=0.03891;1D=0.0417;7D=0.0417;14D=0.0435
7        B  0.03891   0.0418   0.0417   0.0435  0D=0.03891;1D=0.0418;7D=0.0417;14D=0.0435

撰写回答