我想在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
我认为一次全部处理会更高效,更清洁? 有什么建议吗?
答案 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]