【问题标题】:Split strings in DataFrame and keep only certain parts在 DataFrame 中拆分字符串并仅保留某些部分
【发布时间】:2020-11-25 17:10:41
【问题描述】:

我有一个这样的数据框:

x = ['3.13.1.7-2.1', '3.21.1.8-2.2', '4.20.1.6-2.1', '4.8.1.2-2.0', '5.23.1.10-2.2']
df = pd.DataFrame(data = x, columns = ['id'])

    id
0   3.13.1.7-2.1
1   3.21.1.8-2.2
2   4.20.1.6-2.1
3   4.8.1.2-2.0
4   5.23.1.10-2.2

我需要在句点上拆分每个 id 字符串,然后我需要知道第二部分何时为 13,第三部分何时为 1。理想情况下,我会有一个额外的列是布尔值(在上面例如,索引 0 为 TRUE,其他所有为 FALSE)。但是我可以使用多个附加列,其中一个或多个包含单独的字符串部分,一个用于所述布尔值。

我首先尝试将字符串分成几部分:

df['id_split'] = df['id'].apply(lambda x: str(x).split('.'))

这行得通,但是如果我尝试像这样仅隔离字符串的第二部分...

df['id_split'] = df['id'].apply(lambda x: str(x).split('.')[1])

...我收到列表索引超出范围的错误。

但是,如果我像这样检查 DataFrame 中的任何单个索引...

df['id_split'][0][1]

...这行得通,只产生字符串列表中的第二项。

我想我对 .apply() 方法的作用还不够熟悉,无法知道它为什么不接受列表索引。但无论如何,我想知道如何隔离每个字符串的第二部分和第三部分,检查它们的值,并以可扩展的方式输出基于这些值的布尔值(实际数据集是数百万行)。谢谢!

【问题讨论】:

  • df.id.str.split(".",expand=True) 将为您提供多个列

标签: python pandas dataframe split apply


【解决方案1】:

让我们使用str.split获取零件,然后您可以比较:

parts = df['id'].str.split('\.', expand=True)

(parts[[1,2]] == ['13','1']).all(1)

输出:

0     True
1    False
2    False
3    False
4    False
dtype: bool

【讨论】:

  • 谢谢,我最终在我的实际代码中使用了这个方法,因为正如上面评论中提到的,我无法得到第一个答案来处理我的实际数据集,即使它是一个有效的方法在这个测试数据集上。
【解决方案2】:

你可以这样做

df['flag'] = df['id'].apply(lambda x: True if x.split('.')[1] == '13' and x.split('.')[2]=='1' else False)

输出

            id   flag
0   3.13.1.7-2.1   True
1   3.21.1.8-2.2  False
2   4.20.1.6-2.1  False
3    4.8.1.2-2.0  False
4  5.23.1.10-2.2  False

【讨论】:

    【解决方案3】:

    你可以直接做,如下:

    df['new'] = df['id'].apply(lambda x: str(x).split('.')[1]=='13' and str(x).split('.')[2]=='1')
    
    >>> print(df)
                  id    new
    0   3.13.1.7-2.1   True
    1   3.21.1.8-2.2  False
    2   4.20.1.6-2.1  False
    3    4.8.1.2-2.0  False
    4  5.23.1.10-2.2  False
    

    【讨论】:

    • 奇怪...这适用于我的示例数据集,但我的实际数据集仍然出现“列表索引超出范围”错误。无论如何我都会接受这个答案,因为它确实有效,而且我不确定两个 dfs 之间的关键区别是什么。谢谢。
    • 我怀疑有些单元格的 '.' 出现次数少于 2 次。这将导致 str(x).split('.')[2] 出现此错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2022-11-03
    相关资源
    最近更新 更多