如何将整个熊猫DataFrame拆分为列表并选择第n个元素

时间:2018-08-27 18:10:38

标签: python pandas

我想在pandas DataFrame中添加元素并具有特定元素:

df =pd.DataFrame({'name':
                ["0;0;*;1;1...1...1;1;*;1;1","0;0;*;1;1...1...1;1;*;1;2"],
              'name2':
                ["0;0;*;1;1...1...1;1;*;1;3","0;0;*;1;1...1...1;1;*;1;4"]})
>>> print(df)
                    name                      name2
0  0;0;*;1;1...1...1;1;*;1;1  0;0;*;1;1...1...1;1;*;1;3
1  0;0;*;1;1...1...1;1;*;1;2  0;0;*;1;1...1...1;1;*;1;4

用“。”分隔。列出效果很好:

>>> print(df.apply(lambda x: x.str.split(".")))
                            name                              name2
0  [0;0;*;1;1, , , 1, , , 1;1;*;1;1]  [0;0;*;1;1, , , 1, , , 1;1;*;1;3]
1  [0;0;*;1;1, , , 1, , , 1;1;*;1;2]  [0;0;*;1;1, , , 1, , , 1;1;*;1;4]

由于某些原因,“ ...”(实际上存在子字符串)不太理想:

print(df.apply(lambda x: x.str.split("...")))
              name                name2
0  [, , , , , , , , 1]  [, , , , , , , , 3]
1  [, , , , , , , , 2]  [, , , , , , , , 4]

有人知道为什么吗?

但是主要问题是我不知道如何从列表中获取特定元素。这只会显示特定的行:

>>> print(df.apply(lambda x: x.str.split(".")[0]))
name     [0;0;*;1;1, , , 1, , , 1;1;*;1;1]
name2    [0;0;*;1;1, , , 1, , , 1;1;*;1;3]
dtype: object

如果我按列处理Dataframe,此方法将起作用:

>>> print(df["name"].apply(lambda x: x.split(".")[-1]))
0    1;1;*;1;1
1    1;1;*;1;2
Name: name, dtype: objec

我认为一次全部处理会更高效,更清洁? 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

第一个问题:

这是因为.是特殊的regex字符。您可以使用\对其进行转义:

>>> df.apply(lambda x: x.str.split("\.\.\."))
                        name                      name2
0  [0;0;*;1;1, 1, 1;1;*;1;1]  [0;0;*;1;1, 1, 1;1;*;1;3]
1  [0;0;*;1;1, 1, 1;1;*;1;2]  [0;0;*;1;1, 1, 1;1;*;1;4]

第二个问题:

再次使用str进行索引:

>>> df.apply(lambda x: x.str.split(".").str[0])
        name      name2
0  0;0;*;1;1  0;0;*;1;1
1  0;0;*;1;1  0;0;*;1;1

答案 1 :(得分:2)

您可以将applymap与利用lambda方法str的{​​{1}}一起使用。避免被解释为正则表达式的一种方法。

split

并引用拆分的第一个元素

df.applymap(lambda x: x.split('...'))

                        name                      name2
0  [0;0;*;1;1, 1, 1;1;*;1;1]  [0;0;*;1;1, 1, 1;1;*;1;3]
1  [0;0;*;1;1, 1, 1;1;*;1;2]  [0;0;*;1;1, 1, 1;1;*;1;4]