从三个数据框列中提取多个分隔的数据元素

1 投票
1 回答
45 浏览
提问于 2025-04-14 18:35

我有一个数据框,已经筛选出需要的数据。现在剩下三列数据,我想进一步筛选一下,希望能得到一些指导。

ID Column_A Column_B Column_C
01 Data_1;Data_2;Data_3 Data_4;Data_5 Data_6
02 Data_7 Data_8;Data_9 NaN
03 NaN NaN NaN
04 Garbage Data_10;Data_11 Data_12

最终的列表

Data_1, Data_2, Data_3.......Data_12

请注意,实际数据的格式和上面有点不同。我为了这个问题简化了数据格式,以便于理解这个概念。

我需要逐列处理这三列数据,提取出所有符合特定格式的数据元素,也就是以“Data_”开头,后面跟着数字字符 - <[0-9]{3}>。

有些条目没有数据,有些只有一个元素,其他的最多有三个用分号分隔的元素,还有一些是垃圾数据或者格式不好的数据。

我需要忽略所有其他数据,比如空白、NaN和格式不好的数据。

我考虑逐行逐列地遍历,逐个分割数据,用分号分开,然后检查每个分开的元素是否符合正确的格式,如果符合就添加到列表中。然后对B列和C列也重复这个过程。

之后我可以去掉重复的,进行排序和索引。这样我就能得到一个唯一的、有序的列表。

请给我一些想法和指导。

谢谢

1 个回答

3

stackstr.extractall 然后转换为 to_list

out = df.stack().str.extractall(r'(Data_\d+)')[0].to_list()

注意:如果你的正则表达式是 Data_[0-9]{3},可以改用这个,并可选择性地添加单词边界(r'\b(Data_[0-9]{3})\b'),这样可以确保只匹配完整的单词。

另外,如果你确实需要在 ; 上进行 split,然后用 str.fullmatch 进行过滤:

s = df.stack().str.split(';').explode().dropna()

out = s[s.str.fullmatch(r'Data_\d+')].tolist()

输出:

['Data_1', 'Data_2', 'Data_3', 'Data_4', 'Data_5', 'Data_6', 'Data_7', 'Data_8', 'Data_9', 'Data_10', 'Data_11', 'Data_12']

撰写回答