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

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() 会很麻烦。

你可能感兴趣的:(Pandas,pandas,python,数据分析,机器学习,数据挖掘)