【问题标题】:Explode list cells in Pandas and additional formattingPandas 中的分解列表单元格和其他格式
【发布时间】:2021-11-06 08:01:25
【问题描述】:

我有一个如下所示的数据框:

Statement        Standard A       Standard B      Standard C
Statement 1      A1               B-1.2.3, 1.2.4
Statement 1      A1                               C2, 3, 4 
Statement 2      A2                               C5  
Statement 3      A3               B-1.2.5
Statement 3      A3                               C6,7
{
    "Statement": ["Statement 1", "Statement 1", "Statement 2",
                  "Statement 3", "Statement 3",],
    "Standard A": ["A1", "A1", "A2", "A3", "A3"],
    "Standard B": ["B-1.2.3, 1.2.4", np.nan, np.nan, "B-1.2.5", np.nan],
    "Standard C": [np.nan, "C2, 3, 4 ", "C5  ", np.nan, "C6,7"],
}

基本上我需要做的就是把它转换成这个:

Statement        Standard A       Standard B      Standard C
Statement 1      A1               B-1.2.3         C2
Statement 1      A1               B-1.2.4         C3
Statement 1      A1                               C4
Statement 2      A2                               C5  
Statement 3      A3               B-1.2.5         C6
Statement 3      A3                               C7

为了帮助澄清,有 3 个标准。每个标准都有许多映射到“声明”的标准“参考”。

所以标准 B-1.2.3 和 B-1.2.4(来自标准 B) C2、C3 和 C4(来自标准 C)映射到声明 1。A1(来自标准 A ) 也可以,但标准 A 已经完全映射。

现在我有三个问题:

  1. 标准前缀(“B-”和“C”)仅应用于行中的第一个引用。每个标准参考都需要前缀。 (可选)

  2. 各个标准引用(在标准内)列在同一行(带有','分隔符),并且每个引用都需要在自己的行中

  3. 标准是交错的(即 B-1.2.3 和 C2 可以在同一行,但它们不是)

我已尝试在此处应用解决方案:Split cell into multiple rows in pandas dataframe,但我的列有不同的长度,因此我收到说明该事实的错误。

我也尝试过调整这个解决方案,也没有成功:Pandas dataframe: how do I split one row into multiple rows by multi-value column?

我不相信这些解决方案中的任何一个都适用。我可能找错树了。

我现在很迷茫。

【问题讨论】:

  • 您应该编辑您的问题以显示您尝试过的内容以及遇到的问题。您还应该描述Statement C 是如何分布到输出数据帧中的。
  • 应该是Standard C,我的错。我已对其进行了修改,并添加了更多信息。

标签: python pandas data-analysis


【解决方案1】:

这是一个工作管道:

import re
(df.assign(**{'Standard B': df['Standard B'].str.split(',\s*')})
   .explode('Standard B')
   .assign(**{'Standard B': lambda d: d['Standard B'].str.replace('^(\d)', r'B-\1', regex=True),
              'Standard C': lambda d: re.split('\s*,\s*', ', '.join(df['Standard C'].dropna())),
             })
   .assign(**{'Standard C': lambda d: d['Standard C'].str.replace('^(\d)', r'C\1', regex=True),
             })
)

输出:

     Statement Standard A Standard B Standard C
0  Statement 1         A1    B-1.2.3         C2
0  Statement 1         A1    B-1.2.4         C3
1  Statement 1         A1        NaN         C4
2  Statement 2         A2        NaN         C5
3  Statement 3         A3    B-1.2.5         C6
4  Statement 3         A3        NaN         C7

【讨论】:

  • 就是这样!我能够使其适应我的项目。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多