从三个数据框列中提取多个分隔的数据元素
我有一个数据框,已经筛选出需要的数据。现在剩下三列数据,我想进一步筛选一下,希望能得到一些指导。
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
stack
和 str.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']