Использование str в split в pandas
вот некоторые фиктивные данные, которые я создал для моего вопроса. У меня есть два вопроса по этому поводу:
- почему
split
С помощьюstr
в первой части запроса, а не во второй части? -
Почему
[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", ко всем значениям в ряду и возвращает другой ряд.