Pandas 中的分解列表单元格和其他格式
Explode list cells in Pandas and additional formatting
我有一个如下所示的数据框:
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 已经完全映射。
现在我有三个问题:
标准前缀(“B-”和“C”)仅应用于行中的第一个引用。每个标准参考都需要前缀。 (可选)
单独的标准参考文献(在标准中)列在同一行(带','分隔符),每个参考文献需要在其自己的行中
标准错开(即B-1.2.3和C2可以在同一行,但不是)
我已经尝试在此处应用该解决方案:,但我的列的长度不同,因此我收到了说明该事实的错误。
我也试过采用这个解决方案,同样没有成功:Pandas dataframe: how do I split one row into multiple rows by multi-value column?
我不相信这些解决方案中的任何一个都适用。我可能找错树了。
此时我很迷茫。
这是一个工作流水线:
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-', 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', 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
我有一个如下所示的数据框:
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 已经完全映射。
现在我有三个问题:
标准前缀(“B-”和“C”)仅应用于行中的第一个引用。每个标准参考都需要前缀。 (可选)
单独的标准参考文献(在标准中)列在同一行(带','分隔符),每个参考文献需要在其自己的行中
标准错开(即B-1.2.3和C2可以在同一行,但不是)
我已经尝试在此处应用该解决方案:
我也试过采用这个解决方案,同样没有成功:Pandas dataframe: how do I split one row into multiple rows by multi-value column?
我不相信这些解决方案中的任何一个都适用。我可能找错树了。
此时我很迷茫。
这是一个工作流水线:
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-', 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', 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