我正在将csv文件读取到pandas df。每行都是一个长网址,我用正斜杠分开。
在某些情况下,当我分割url时,会填充更多列,因为url带有更多的正斜杠并且模式是不同的。我正在尝试找到可以转换为整数的第一列,并在此之前删除这些列。该列将不是整数形式,而是对象形式,因为它是可以转换为int(或转换为float并随后转换为int)的字符串。
最终,我想提取该数字列和最后一列(URL的末尾),中间的所有内容都可以删除。在某些情况下,不会有包含is_numeric值的列,在这种情况下,我只想提取最后一列。
例如,在拆分url之后,我得到一个如下所示的数据帧:[在此示例中,有4列,在我的中有6列,但是同一件事,我只想要第一个数字,然后是最后一个列,如果没有第一个数字列,我只希望最后一个以.html结尾的列
+--------------------------+-----------------+----------+------------------------+
| 1 | 2 | 3 | 4 |
+--------------------------+-----------------+----------+------------------------+
| 11100411 | h_aa_kk_mm.html | None | None |
| nnn | 51200411 | aa_bb_cc | k_yxxxxxxx_mmmm.html |
| 11100411_h_aa_kk_mm.html | None | None | None |
| hmn | bb_a_34 | 76800616 | 999ccc-ddd.html |
| nnn | 92503462 | v | 66631xxxxffffkkka.html |
在这种情况下,我想要的结果是:
+----------+--------------------------+
| 1 | 2 |
+----------+--------------------------+
| 11100411 | h_aa_kk_mm.html |
| 51200411 | k_yxxxxxxx_mmmm.html |
| 76800616 | 999ccc-ddd.html |
| 92503462 | 66631xxxxffffkkka.html |
+----------+--------------------------+
df2 ..
None | 11100411_h_aa_kk_mm.html |
在有数字列的情况下,可以将它们提取到自己的数据框中,我可以分别处理它们。
我知道我可以通过测试每个用例和列并使用is_numeric来做到这一点,但是问题是如果我做is_numeric,我就有可能覆盖我需要的html末尾的风险,并且不得不低效率地检查每种情况。该数据框目前为300,000行,因此,我不要让自己迷惑并跟踪不同情况的最简单方法非常重要,因为当务之急是不要丢失任何数据。
[我已经阅读了所有可以找到的堆栈溢出信息,但是情况略有不同,在发布之前,我尝试了数小时的各种不同方式] 谢谢。
答案 0 :(得分:1)
熊猫表不适用于处理长度可变的数据。考虑不要将url部分放在pandas表中,而是使用Python列表和普通的Python函数。
parts = map(lambda s: s.split("/"), urls)
您可以使用Python函数将网址部件列表分为两堆。然后,您可以在第一堆上工作,以找到第一个数字值和最后一个有效值。然后将它们放入DataFrame中。
如果您打算使用Pandas,则可以这样写:
has_numeric = df.apply(lambda x: x.str.isnumeric().any(), axis=1)
df1 = df[has_numeric]
df2 = df[~has_numeric]
nums = df1.apply(lambda x: x[(x.str.isnumeric() == True).idxmax()], axis=1)
ends = df1.apply(lambda row: row[~row.isnull()].iloc[-1], axis=1)
>>> df
0 1 2 3
0 11100411 h_aa_kk_mm.html None None
1 nnn 51200411 aa_bb_cc k_yxxxxxxx_mmmm.html
2 11100411_h_aa_kk_mm.html None None None
3 hmn bb_a_34 76800616 999ccc-ddd.html
4 nnn 92503462 v 66631xxxxffffkkka.html
>>> df1
0 1 2 3
0 11100411 h_aa_kk_mm.html None None
1 nnn 51200411 aa_bb_cc k_yxxxxxxx_mmmm.html
3 hmn bb_a_34 76800616 999ccc-ddd.html
4 nnn 92503462 v 66631xxxxffffkkka.html
>>> df2
0 1 2 3
2 11100411_h_aa_kk_mm.html None None None
>>> nums
0 11100411
1 51200411
3 76800616
4 92503462
dtype: object
>>> ends
0 h_aa_kk_mm.html
1 k_yxxxxxxx_mmmm.html
3 999ccc-ddd.html
4 66631xxxxffffkkka.html
dtype: object