lst_col = 'samples'r = pd.Dataframe({ col:np.repeat(df[col].values, df[lst_col].str.len()) for col in df.columns.drop(lst_col)} ).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.columns]
结果:
In [103]: rOut[103]: samples subject trial_num0 0.10 1 11 -0.20 1 12 0.05 1 13 0.25 1 24 1.32 1 25 -0.17 1 26 0.64 1 37 -0.22 1 38 -0.71 1 39 -0.03 2 110 -0.65 2 111 0.76 2 112 1.77 2 213 0.89 2 214 0.65 2 215 -0.98 2 316 0.65 2 317 -0.30 2 3
PS 在这里你可能会发现一些通用的解决方案
更新:一些解释:IMO了解此代码的最简单方法是尝试逐步执行它:
在下一行中,我们将在一列N时间内重复值,其中
N-是相应列表的长度:
In [10]: np.repeat(df['trial_num'].values, df[lst_col].str.len())Out[10]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3], dtype=int64)
可以对所有包含标量值的列进行概括:
In [11]: pd.Dataframe({ ...:col:np.repeat(df[col].values, df[lst_col].str.len()) ...:for col in df.columns.drop(lst_col)} ...: )Out[11]: trial_num subject01 111 121 132 142 152 163 1.. ... ...11 1 212 2 213 2 214 2 215 3 216 3 217 3 2[18 rows x 2 columns]
使用np.concatenate()我们可以展平列list(samples)中的所有值并获得一维向量:
In [12]: np.concatenate(df[lst_col].values)Out[12]: array([-1.04, -0.58, -1.32, 0.82, -0.59, -0.34, 0.25, 2.09, 0.12, 0.83, -0.88, 0.68, 0.55, -0.56, 0.65, -0.04, 0.36, -0.31])
将所有这些放在一起:
In [13]: pd.Dataframe({ ...:col:np.repeat(df[col].values, df[lst_col].str.len()) ...:for col in df.columns.drop(lst_col)} ...: ).assign(**{lst_col:np.concatenate(df[lst_col].values)})Out[13]: trial_num subject samples01 1 -1.0411 1 -0.5821 1 -1.3232 1 0.8242 1 -0.5952 1 -0.3463 1 0.25.. ... ... ...11 1 2 0.6812 2 2 0.5513 2 2 -0.5614 2 2 0.6515 3 2 -0.0416 3 2 0.3617 3 2 -0.31[18 rows x 3 columns]
使用
pd.Dataframe()[df.columns]将确保我们按原始顺序选择列…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)