当前位置: 首页 > 面试题库 >

Python-列表的pandas列,为每个列表元素创建一行

巫马瀚漠
2023-03-14
问题内容

我有一个数据框,其中某些单元格包含多个值的列表。我不想扩展一个单元格中的多个值,而是想扩展数据框,以便列表中的每个项目都有自己的行(所有其他列中的值都相同)。所以,如果我有:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'trial_num': [1, 2, 3, 1, 2, 3],
     'subject': [1, 1, 1, 2, 2, 2],
     'samples': [list(np.random.randn(3).round(2)) for i in range(6)]
    }
)

df
Out[10]: 
                 samples  subject  trial_num
0    [0.57, -0.83, 1.44]        1          1
1    [-0.01, 1.13, 0.36]        1          2
2   [1.18, -1.46, -0.94]        1          3
3  [-0.08, -4.22, -2.05]        2          1
4     [0.72, 0.79, 0.53]        2          2
5    [0.4, -0.32, -0.13]        2          3

如何转换为长格式,例如:

   subject  trial_num  sample  sample_num
0        1          1    0.57           0
1        1          1   -0.83           1
2        1          1    1.44           2
3        1          2   -0.01           0
4        1          2    1.13           1
5        1          2    0.36           2
6        1          3    1.18           0
# etc.

索引并不重要,可以将现有的列设置为索引也可以,最后的顺序也不重要。


问题答案:
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了解此html" target="_blank">代码的最简单方法是尝试逐步执行它:

在下一行中,我们将在一列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]将确保我们按原始顺序选择列…



 类似资料:
  • 我有一个数据框,其中一些单元格包含多个值的列表。我不想在一个单元格中存储多个值,而是希望扩展dataframe,以便列表中的每个项都有自己的行(在所有其他列中都有相同的值)。因此,如果我有: 如何转换为长格式,例如: 索引并不重要,可以将现有列设置为索引,而最终的顺序并不重要。

  • 问题内容: 我有一个带有包含列表对象的列的Pandas DataFrame 如何访问每个列表的第一个元素并将其保存到DataFrame的新列中?要获得这样的结果: 我知道这可以通过遍历每一行来完成,但是有什么“ pythonic”方法吗? 问题答案: 您可以使用和功能

  • 问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 我有两个清单: 我需要从这些列表中创建一个元组列表,如下所示: 我尝试这样做: 但导致: 即x中每个元素与y中每个元素的元组列表…什么是我想做的正确方法?谢谢… 编辑: 在编辑之前提到的其他两个重复是我的错,我将其缩进另一个for循环中是错误的… 问题答案: 使用内置函数: 在Python 3中: 在Python 2中:

  • 我有一个数据框架,我想从其中一列的列表中创建5列 示例: 请注意,这里很少有列表少于5列,对于这些列,请在该位置插入NAN。

  • 问题内容: 我有一列如下所示的熊猫: 我需要将列表的此列分为2列,并使用。 问题答案: 您可以使用与构造函数通过转换为创建通过使用: 对于新的DataFrame: 解决方案apply(pd.Series)非常慢:

  • 问题内容: 我需要增量填充列表或列表元组。看起来像这样: 为了使它不那么冗长,更优雅,我想我会预先分配一个空列表 预分配部分对我来说并不明显。当我这样做时,我会收到对同一列表的引用列表,因此以下内容的输出 是: 我可以使用循环(),但我想知道是否存在“无环”解决方案。 是获得我想要的东西的唯一方法 问题答案: 这将创建x个不同的列表,每个列表都有一个列表副本(该列表中的每个项目都是通过引用提供的,