#python #pandas #dataframe
#python #pandas #dataframe
Вопрос:
У меня есть DataFrame, который выглядит как:
df1:
A | B | C
----|-----|----
2T | 3K | 0.0None
3K | 7K | 4T
0.0N| 4T | 3T
Что мне нужно, так это разделить и добавить значения, в которых есть T и K, и возвращать только число без текста. Также полностью игнорировать 0.0Nonne.
Итоговая таблица должна выглядеть следующим образом:
df2:
T | K
----|----
2 | 3
4 | 10
7 | 0
Ответ №1:
stack
фрейм данных, который нужно изменить, затем используйте Series.str.extract
с шаблоном регулярных выражений, указав группы захвата и sum
на level=0
:
p = r'^(?:(?P<T>[d.] (?=T))|(?P<K>[d.] (?=K)))'
s = df.stack().str.extract(p).astype(float).sum(level=0)
T K
0 2.0 3.0
1 4.0 10.0
2 7.0 0.0
Комментарии:
1. @bassline_ballerina Можете ли вы уточнить?
2. Привет, это работает, но не дает мне правильных результатов. Реальный фрейм данных, который у меня есть, имеет значения: Первая строка: 110,0T 141,9T 85,0T 0,0Нет, Вторая строка: 125,0T 109,65T 75,0T 120,69999999999999T « ваш код возвращает: Первая строка 9 для T и 0 для K, Вторая строка 7e 13 для T и 0 для K
3. Мне кажется, что он принимает только номер вычисления после точки.
4. @bassline_ballerina Можешь попробовать
s = df.stack().str.extract(r'^(?:(?P<T>[d.] (?=T))|(?P<K>[d.] (?=K)))').astype(float).sum(level=0)
Ответ №2:
Давайте попробуем извлечь значения с помощью str.extract
. Затем groupby().sum()
:
(df.stack().str.extract('^(d )(T|K)')
.dropna()
.assign(order=lambda x: x.groupby([1]).cumcount())
.pivot(index='order',columns=[1], values=0)
.astype(float)
.groupby('T', as_index=False).sum()
)
Вывод:
1 T K
0 2.0 3.0
1 3.0 0.0
2 4.0 10.0