使用熊猫清理csv数据,是否有办法找到可以转换为#?的第一个obj列?

时间:2018-08-15 20:17:13

标签: python pandas numpy dataframe

我正在将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行,因此,我不要让自己迷惑并跟踪不同情况的最简单方法非常重要,因为当务之急是不要丢失任何数据。

[我已经阅读了所有可以找到的堆栈溢出信息,但是情况略有不同,在发布之前,我尝试了数小时的各种不同方式] 谢谢。

1 个答案:

答案 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