61

您所在的位置:网站首页 如何将一行里面数据提取为 61

61

2023-05-20 12:10| 来源: 网络整理| 查看: 265

61_Pandas中将列表存储和处理为 pandas 中的元素

作为 pandas.DataFrame 的一个元素,Series,你可以存储列表,这是 Python 的内置类型。

例如,对于由分隔符分隔的字符串,列出它们可能比用字符串方法处理它们更方便。

在此,对以下内容进行说明。

从 pandas.DataFrame 中的字符串列生成列表列将函数和方法应用于列表列 获取列表中的元素数量对列表进行排序将一个列表连接成一个字符串从列表中添加和删除元素 根据列表的条件提取行

以下面的 pandas.DataFrame 为例。

import pandas as pd df = pd.DataFrame({'s': ['X,Y,Z', 'X', 'XY,Y', 'Y,Z,XY']}, index=['a', 'b', 'c', 'd']) print(df) # s # a X,Y,Z # b X # c XY,Y # d Y,Z,XY 从 pandas.DataFrame 中的字符串列生成列表列

使用字符串方法 str.split()。如果参数 expand=True,它将被分成多列,但默认情况下(expand=False)它将是一个列表。

df['l'] = df['s'].str.split(',') print(df) # s l # a X,Y,Z [X, Y, Z] # b X [X] # c XY,Y [XY, Y] # d Y,Z,XY [Y, Z, XY]

列数据类型 dtype 是字符串列和列表列的对象,但每个元素都有自己的类型。

print(df.dtypes) # s object # l object # dtype: object print(type(df.at['a', 's'])) # print(type(df.at['a', 'l'])) #

如果分隔符后有一个空格,如 X、Y、Z 而不是 X、Y、Z,strip() 将删除它。这个例子没有变化。 该过程使用匿名函数定义,并使用 apply() 应用于每个元素。 map() 也可以。

print(df['s'].apply(lambda x: [s.strip() for s in x.split(',')])) # a [X, Y, Z] # b [X] # c [XY, Y] # d [Y, Z, XY] # Name: s, dtype: object

如果空格个数相同,像str.split(', ')那样指定分隔符是没有问题的。

将函数和方法应用于列表列

使用 pandas.DataFrame 列(= pandas.Series)的 apply() 或 map() 为 Python 列表列表类型应用函数和方法。

不将元素作为参数的方法(例如列表本身的方法)使用匿名函数(lambda 表达式)。

获取列表中的元素数量 len()。 print(df['l'].apply(len)) # a 3 # b 1 # c 2 # d 3 # Name: l, dtype: int64 对列表进行排序 sorted()。 print(df['l'].apply(sorted)) # a [X, Y, Z] # b [X] # c [XY, Y] # d [XY, Y, Z] # Name: l, dtype: object 将一个列表连接成一个字符串 join()。 print(df['l'].apply(','.join)) # a X,Y,Z # b X # c XY,Y # d Y,Z,XY # Name: l, dtype: object

排序然后连接到一个字符串。

print(df['l'].apply(lambda x: ','.join(sorted(x)))) # a X,Y,Z # b X # c XY,Y # d XY,Y,Z # Name: l, dtype: object 从列表中添加和删除元素

使用列表方法 append() 添加元素。一个新元素被添加到原始列表中。

df['l'].apply(lambda x: x.append('A')) print(df) # s l # a X,Y,Z [X, Y, Z, A] # b X [X, A] # c XY,Y [XY, Y, A] # d Y,Z,XY [Y, Z, XY, A]

使用列表的 remove() 方法删除元素。由于如果指定了不存在的元素,remove() 将导致错误,因此仅当使用三元运算符存在目标元素时才应用 remove()。

df['l'].apply(lambda x: x.remove('Z') if 'Z' in x else x) print(df) # s l # a X,Y,Z [X, Y, A] # b X [X, A] # c XY,Y [XY, Y, A] # d Y,Z,XY [Y, XY, A] 根据列表的条件提取行

将对列表应用返回bool值(True, False)的函数得到的bool类型pandas.Series传给原来的pandas.DataFrame。

print(df['l'].apply(lambda x: 'X' in x)) # a True # b True # c False # d False # Name: l, dtype: bool print(df[df['l'].apply(lambda x: 'X' in x)]) # s l # a X,Y,Z [X, Y, A] # b X [X, A]

列表并不总是更好,根据条件,简单地在原始字符串上使用字符串方法 str.contains() 可能就可以了。

08_Pandas提取含有指定字符串的行(完全匹配,部分匹配) print(df['s'].str.contains('Z')) # a True # b False # c False # d True # Name: s, dtype: bool print(df[df['s'].str.contains('Z')]) # s l # a X,Y,Z [X, Y, A] # d Y,Z,XY [Y, XY, A]

如果 X 和 XZ 等部分分隔元素重叠,则 Str.contains() 会很麻烦。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3