Использование str в split в pandas

вот некоторые фиктивные данные, которые я создал для моего вопроса. У меня есть два вопроса по этому поводу:

  1. почему split С помощью str в первой части запроса, а не во второй части?
  2. Почему [0] собирает первую строку в части 1 и первый элемент из каждой строки в части 2?

    chess_data = pd.DataFrame({"winner": ['A:1','A:2','A:3','A:4','B:1','B:2']})
    chess_data.winner.str.split(":")[0]
    chess_data.winner.map(lambda n: n.split(":")[0])
    

4 ответов


  • chess_data - это таблицы данных
  • chess_data.winner серия
  • chess_data.winner.str является средством доступа к методам, специфичным для строк и оптимизированным (в определенной степени)
  • chess_data.winner.str.split является одним из таких методов
  • chess_data.winner.map это другой метод, который принимает словарь или вызываемый объект и либо вызывает, что вызываемый с каждым элементом в серии или называет словари get метод на каждом элементе серии.

при использовании chess_data.winner.str.split панды делает цикл и выполняет своего рода str.split. В то время как map это более грубый способ сделать то же самое.


С вашими данными.

chess_data.winner.str.split(':')

0    [A, 1]
1    [A, 2]
2    [A, 3]
3    [A, 4]
4    [B, 1]
5    [B, 2]
Name: winner, dtype: object

чтобы получить каждый первый элемент, вы захотите снова использовать метод доступа к строке

chess_data.winner.str.split(':').str[0]

0    A
1    A
2    A
3    A
4    B
5    B
Name: winner, dtype: object

это эквивалентный способ выполнения того, что вы сделали в своем map

chess_data.winner.map(lambda x: x.split(':')[0])

вы могли бы также используется понимание

chess_data.assign(new_col=[x.split(':')[0] for x in chess_data.winner])

  winner new_col
0    A:1       A
1    A:2       A
2    A:3       A
3    A:4       A
4    B:1       B
5    B:2       B

chess_data.winner.str.split(":")[0] 
['A', '1']

это то же самое, что

chess_data.winner.str.split(":").loc[0] 
['A', '1']

и

chess_data.winner.map(lambda n: n.split(":")[0])
0    A
1    A
2    A
3    A
4    B
5    B
Name: winner, dtype: object

это то же самое, что

chess_data.winner.str.split(":").str[0]
0    A
1    A
2    A
3    A
4    B
5    B
Name: winner, dtype: object

Что же

pd.Series([x.split(':')[0] for x in chess_data.winner], name=chess_data.winner.name) 
0    A
1    A
2    A
3    A
4    B
5    B
Name: winner, dtype: object

это описано в документации в разделе индексирование с помощью str

.нотация str[index] индексирует строку по позиции, где as [index] будет срезаться на основе индекса ряда.

на примере

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,'CABA', 'dog', 'cat'])

s.str[3]

возвращает элемент с индексом 3 в каждой строке

0    NaN
1    NaN
2    NaN
3      a
4      a
5    NaN
6      A
7    NaN
8    NaN

, тогда как

s[3]

возвращает

'Aaba'

используйте метод apply для извлечения первого значения из разбитого ряда

chess_data.winner.str.split(':')
Out: 
0    [A, 1]
1    [A, 2]
2    [A, 3]
3    [A, 4]
4    [B, 1]
5    [B, 2]
Name: winner, dtype: object

chess_data.winner.str.split(':').apply(lambda x: x[0])
Out:
0    A
1    A
2    A
3    A
4    B
5    B
Name: winner, dtype: object

при использовании

chess_data.winner.str.split(":")[0] 

вы просто получаете элемент кулака из полученной серии. Но.apply ()применяется некоторая функция, в данном случае "itemgetter", ко всем значениям в ряду и возвращает другой ряд.