Я хочу разбивать элементы в 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
Я думал, что обработка сразу будет более эффективной и чистой? Какие-либо предложения?
Вы можете использовать applymap
с lambda
, который использует str
метод 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]
И для ссылки на первый элемент раскола
df.applymap(lambda x: x.split('...')[0])
name name2
0 0;0;*;1;1 0;0;*;1;1
1 0;0;*;1;1 0;0;*;1;1
Это потому, что .
является специальным 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
applymap
изменило поведение, как вы показали, +1 за это уже!