使用Python Pandas DataFrame将行值转换为列值
将数据框中某一列的值进行分组后,合并列和行的值,并把结果赋值给一个新列。
下面的代码试图实现预期的结果,但运行时间比较长。
代码:
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