如何将条件应用于str.split()

时间:2019-01-30 17:25:05

标签: python pandas

我有一个数据帧,其中每个单元格中包含一个长度变化的字符串,即

    Num
(1,2,3,4,5)
(6,7,8)
(9)
(10,11,12)

我想避免尝试对只有一个数字的单元格执行str.split(',')。但是,我希望将所有单个数字都转换为一个元素的列表。

这是我尝试过的内容,它给出一个错误,指出“'int'对象不可调用”

if(df['Num'].size() > 1):
    df['Num'] = df['Num'].str.split(',')

更新以进行澄清:

Index      Num
0          2,6,7
1      1,3,6,7,8
2      2,4,7,8,9
3     3,5,8,9,10
4         4,9,10
5          1,2,7
6      1,2,3,6,8
7      2,3,4,7,9
8     3,4,5,8,10
9          4,5,9
10           2,3
11           1,3
12           1,2
13         2,3,4
14         1,3,4
15         1,2,4
16         1,2,3
17             2
18             1

我正在尝试获取此数据帧并将每个Num行从一串数字转换为一个列表。我希望将仅包含一个数字(17和18)的所有索引都转换为包含单个元素(本身)的列表。

下面的代码仅在每个字符串均包含多个以','分隔的数字时有效。

df['Adj'] = df['Adj'].str.split(',')

运行以上代码时得到的输出数据帧。请注意,只有一个数字的元素现在是nan。

Index          Num
0            [2, 6, 7]
1      [1, 3, 6, 7, 8]
2      [2, 4, 7, 8, 9]
3     [3, 5, 8, 9, 10]
4           [4, 9, 10]
5            [1, 2, 7]
6      [1, 2, 3, 6, 8]
7      [2, 3, 4, 7, 9]
8     [3, 4, 5, 8, 10]
9            [4, 5, 9]
10              [2, 3]
11              [1, 3]
12              [1, 2]
13           [2, 3, 4]
14           [1, 3, 4]
15           [1, 2, 4]
16           [1, 2, 3]
17                 NaN
18                 NaN

1 个答案:

答案 0 :(得分:1)

假设您的列都是字符串,而您只想将单个数字作为list中的str,则可以达到目的:

df['Num'].str.strip('()').str.split(',')

# 0    [1, 2, 3, 4, 5]
# 1          [6, 7, 8]
# 2                [9]
# 3       [10, 11, 12]
# Name: Num, dtype: object

由于并非所有数据均为str类型,因此您需要首先将其强制为str,以确保正确调用了字符串方法:

df['Num'].astype(str).str.split(',')

# 0            [2, 6, 7]
# 1      [1, 3, 6, 7, 8]
# 2      [2, 4, 7, 8, 9]
# ...
# 16           [1, 2, 3]
# 17                 [2]
# 18                 [1]