作为 pandas.DataFrame 的一个元素,Series,你可以存储列表,这是 Python 的内置类型。
例如,对于由分隔符分隔的字符串,列出它们可能比用字符串方法处理它们更方便。
在此,对以下内容进行说明。
以下面的 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
使用字符串方法 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 表达式)。
print(df['l'].apply(len))
# a 3
# b 1
# c 2
# d 3
# Name: l, dtype: int64
print(df['l'].apply(sorted))
# a [X, Y, Z]
# b [X]
# c [XY, Y]
# d [XY, Y, Z]
# Name: l, dtype: object
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() 可能就可以了。
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() 会很麻烦。