Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在DataFrame中拆分字符串并仅保留某些部分_Python_Pandas_Dataframe_Split_Apply - Fatal编程技术网

Python 在DataFrame中拆分字符串并仅保留某些部分

Python 在DataFrame中拆分字符串并仅保留某些部分,python,pandas,dataframe,split,apply,Python,Pandas,Dataframe,Split,Apply,我有这样一个数据帧: 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字

我有这样一个数据帧:

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])
df['id_split'][0][1]
…我得到一个错误,列表索引超出范围

然而,如果我像这样检查数据帧中的任何单个索引

df['id_split'] = df['id'].apply(lambda x: str(x).split('.')[1])
df['id_split'][0][1]
…此操作有效,只生成字符串列表中的第二项


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

让我们使用
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

您可以直接这样做,如下所示:

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

你可以这样做

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

df.id.str.split(“.”,expand=True)
将为您提供多个列。。。这在我的示例数据集上有效,但在实际数据集上仍然出现“列表索引超出范围”错误。无论如何,我都会接受这个答案,因为它确实有效,而且我不确定这两个dfs之间的关键区别是什么。谢谢。我怀疑有一些单元格少于2次出现“.”,这将导致str(x).split(“.”)[2]出现此错误。谢谢,我在实际代码中使用了此方法,因为正如上面的一条评论所述,我无法得到处理实际数据集的第一个答案,即使它是此测试数据集上的有效方法。