Как разбить весь пандус DataFrame на список и выбрать n-й элемент - PullRequest
0 голосов
/ 27 августа 2018

Я хочу добавить элементы в панды 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 голосов
/ 27 августа 2018

Вы можете использовать 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
0 голосов
/ 27 августа 2018

Первая проблема:

Это потому, что . является специальным 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...