Как разделить целые панды DataFrame на список и выбрать n-й элемент

1

Я хочу разбивать элементы в 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

Я думал, что обработка сразу будет более эффективной и чистой? Какие-либо предложения?

Теги:
pandas

2 ответа

2

Вы можете использовать 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
    Благодарю. Это хорошо работает.
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
    Этот ответ лучше, потому что он объясняет, почему возникла проблема ОП.
  • 0
    Спасибо! Я не знал, что applymap изменило поведение, как вы показали, +1 за это уже!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню