大Pandas旋转桌伴着移动的风

2024-04-18 10:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

从一个以X Y Z为变量的时间序列数据中,我想取N=5(可配置)个数的指令,并将其旋转或输出

前 输入数据

TS | X | Y |    Z
---------------
1   1.1 2.1 3.1
2   1.2 2.2 3.2
3   1.3 2.3 3.3
4   1.4 2.4 3.4
5   1.5 2.5 3.5
6   1.6 2.6 3.6
7   1.7 2.7 3.7
8   1.8 2.8 3.8
9   1.9 2.9 3.9
10  2   3   4
..  ..  ..  ..

----------------

输出为X

TS  X_1 X_2 ..  X_5     Y_1,Y2  ... Y_5..Z_5
--------------------------------------------
1   1.1 1.2     1.5     2.1,2.2..   ..  3.5
2   1.2 1.3     1.6     2.2,    ..  .. .3.6
3   1.3 .. ..  .Na ..  ... .. Na
-------------------------------------------

Tags: 数据指令时间序列nats个数y2
1条回答
网友
1楼 · 发布于 2024-04-18 10:47:14

考虑一个嵌套循环解决方案,它涉及.loc移动行的子集,pivot_table处理列名,pd.concat(垂直),然后再次pd_concat(水平)

df_list = []
for n in df.columns[1:]:

    inner_list = []
    for i in range(0, len(df)):

        # PIVOT LONG TO WIDE
        pvt_df = (df.loc[i:]                                                  # SUBSET BY ROW
                    .assign(Cols='N' + '_' + (df['TS'] - i).astype(str))      # ADD COUNTER COL
                    .pivot_table(columns='Cols', values=n, aggfunc='max')     # RESHAPE WIDE
                    .reindex(columns=['N_' + str(c) for c in range(1,11)])    # RE-ORDER COLS
                    .set_axis([n + '_' + str(c) for c in range(1,11)],        # RENAME COLS
                              axis='columns', inplace=False)                    
                    .rename_axis(columns=None)                                # REMOVE INDEX NAME
                 )
        inner_list.append(pvt_df)

    # VERTICAL APPEND
    df_list.append(pd.concat(inner_list, ignore_index=True))

# HORIZONTAL MERGE
final_df = pd.concat(df_list, axis='columns')

输出

print(final_df)
#    X_1  X_2  X_3  X_4  X_5  X_6  X_7  X_8  X_9  X_10  Y_1  Y_2  Y_3  Y_4  ...  Y_7  Y_8  Y_9  Y_10  Z_1  Z_2  Z_3  Z_4  Z_5  Z_6  Z_7  Z_8  Z_9  Z_10
# 0  1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9   2.0  2.1  2.2  2.3  2.4  ...  2.7  2.8  2.9   3.0  3.1  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9   4.0
# 1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.0   NaN  2.2  2.3  2.4  2.5  ...  2.8  2.9  3.0   NaN  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9  4.0   NaN
# 2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.0  NaN   NaN  2.3  2.4  2.5  2.6  ...  2.9  3.0  NaN   NaN  3.3  3.4  3.5  3.6  3.7  3.8  3.9  4.0  NaN   NaN
# 3  1.4  1.5  1.6  1.7  1.8  1.9  2.0  NaN  NaN   NaN  2.4  2.5  2.6  2.7  ...  3.0  NaN  NaN   NaN  3.4  3.5  3.6  3.7  3.8  3.9  4.0  NaN  NaN   NaN
# 4  1.5  1.6  1.7  1.8  1.9  2.0  NaN  NaN  NaN   NaN  2.5  2.6  2.7  2.8  ...  NaN  NaN  NaN   NaN  3.5  3.6  3.7  3.8  3.9  4.0  NaN  NaN  NaN   NaN
# 5  1.6  1.7  1.8  1.9  2.0  NaN  NaN  NaN  NaN   NaN  2.6  2.7  2.8  2.9  ...  NaN  NaN  NaN   NaN  3.6  3.7  3.8  3.9  4.0  NaN  NaN  NaN  NaN   NaN
# 6  1.7  1.8  1.9  2.0  NaN  NaN  NaN  NaN  NaN   NaN  2.7  2.8  2.9  3.0  ...  NaN  NaN  NaN   NaN  3.7  3.8  3.9  4.0  NaN  NaN  NaN  NaN  NaN   NaN
# 7  1.8  1.9  2.0  NaN  NaN  NaN  NaN  NaN  NaN   NaN  2.8  2.9  3.0  NaN  ...  NaN  NaN  NaN   NaN  3.8  3.9  4.0  NaN  NaN  NaN  NaN  NaN  NaN   NaN
# 8  1.9  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  2.9  3.0  NaN  NaN  ...  NaN  NaN  NaN   NaN  3.9  4.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN
# 9  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  3.0  NaN  NaN  NaN  ...  NaN  NaN  NaN   NaN  4.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN

相关问题 更多 >