python每行乘列表_Python-列表的pandas列,为每个列表元素创建一行

小编典典

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]: r

Out[103]:

samples subject trial_num

0 0.10 1 1

1 -0.20 1 1

2 0.05 1 1

3 0.25 1 2

4 1.32 1 2

5 -0.17 1 2

6 0.64 1 3

7 -0.22 1 3

8 -0.71 1 3

9 -0.03 2 1

10 -0.65 2 1

11 0.76 2 1

12 1.77 2 2

13 0.89 2 2

14 0.65 2 2

15 -0.98 2 3

16 0.65 2 3

17 -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 subject

0 1 1

1 1 1

2 1 1

3 2 1

4 2 1

5 2 1

6 3 1

.. ... ...

11 1 2

12 2 2

13 2 2

14 2 2

15 3 2

16 3 2

17 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 samples

0 1 1 -1.04

1 1 1 -0.58

2 1 1 -1.32

3 2 1 0.82

4 2 1 -0.59

5 2 1 -0.34

6 3 1 0.25

.. ... ... ...

11 1 2 0.68

12 2 2 0.55

13 2 2 -0.56

14 2 2 0.65

15 3 2 -0.04

16 3 2 0.36

17 3 2 -0.31

[18 rows x 3 columns]

使用pd.DataFrame()[df.columns]将确保我们按原始顺序选择列…

2020-02-16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值