在 pandas 中使用 pivot.table 重塑数据的问题

Problems with reshaping data using pivot.table in pandas

我的数据框如下所示,有多个不同的钻孔/[DH] 穿过单个地下结构,[VARIABLE] 和 [DISTANCE_TO] 结构本身,距离为 0结构内。变量是浮点数,为了简单起见,这里改为 X。

[DH]    [VARIABLE]  [DISTANCE_TO]
DH111   X           3
DH111   X           2
DH111   X           1
DH111   X           0
DH111   X           1
DH111   X           2
DH111   X           4
DH222   X           3
DH222   X           2
DH222   X           1
DH222   X           0
DH222   X           0
DH222   X           1
DH222   X           2
DH333   X           2
DH333   X           1
DH333   X           0
DH333   X           1
DH333   X           2

我正在尝试使用 pandas 数据透视函数来更改数据,因此我有一列用于 DISTANCE_TO,每个 DHID 都有 VARIABLE,如下所示:

[DISTANCE_TO]     [DH111 VAR]       [DH222 VAR]     [DH333 VAR]
4                 NaN               X               NaN
3                 X                 X               NaN
2                 X                 X               X
1                 X                 X               X
0                 X                 X               X
0                 NaN               X               NaN
1                 X                 X               X
2                 X                 X               X
3                 X                 NaN             NaN
4                 NaN               NaN             NaN

这是我使用的代码 df_split = pd.pivot_table(df,index=[‘DHID', 'DISTANCE_TO]) 但我没有按照我的意愿拆分 DHID,它只是将 [DISTANCE_TO] 重新排列为数字升序...这可能不起作用的一个原因是因为某些 DHID 通过结构的时间更长,例如在 DH222 中有两行,其中 0 是一个值,我不确定这将如何干扰。

您还需要在 pivot_table 中指定列和值。

您是对的,存在如何 select 多个值第一个的问题。这就是pivot_tableaggfunc参数的作用。默认情况下,它是 np.mean,它只适用于数字类型。如果您的变量是字符串,例如 'X',您可以例如 select 第一个 'first':

>>> df.pivot_table(columns='[DH]', index='[DISTANCE_TO]', values='[VARIABLE]', aggfunc='first')
[DH]          DH111 DH222 DH333
[DISTANCE_TO]                  
0                 X     X     X
1                 X     X     X
2                 X     X     X
3                 X     X   NaN
4                 X   NaN   NaN

您也可以编写自己的 aggfunc,它基本上是一个从 [VARIABLE] 列接收 pd.Series 个值的函数,它需要 return 个单个标量值。因此,要使用 lambda 执行与 first 相同的操作,您可以执行以下操作:

>>> df.pivot_table(columns='[DH]', index='[DISTANCE_TO]', values='[VARIABLE]', aggfunc=lambda s: s.iloc[0])
[DH]          DH111 DH222 DH333
[DISTANCE_TO]                  
0                 X     X     X
1                 X     X     X
2                 X     X     X
3                 X     X   NaN
4                 X   NaN   NaN