У меня есть такой фрейм данных:
IndividualID Trip1 Trip2 Trip3 Trip4 Trip5 Trip6 Trip7 Trip8 Trip9
200100001 23 1 2 4 4 1 5 5 5
200100002 21 1 12 3 1 55 7 7
200100003 12 3 3 6 3
200100004 4
200100005 6 5 3 9 3 5 6
200100005 23 4 4 2 4 3 6 5
Я пытаюсь узнать количество поездок, которые совершает каждый человек, поэтому я хотел бы создать новый столбец, чтобы новая таблица, вероятно, выглядела так:
IndividualID Trip1 Trip2 Trip3 Trip4 Trip5 Trip6 Trip7 Trip8 Trip9 Chains
200100001 23 1 2 4 4 1 5 5 5 9
200100002 21 1 12 3 1 55 7 7 8
200100003 12 3 3 6 3 5
200100004 4 1
200100005 6 5 3 9 3 5 6 7
200100005 23 4 4 2 4 3 6 5 8
Есть ли возможные решения? Буду очень признателен, если кто-то может помочь с этим! Заранее спасибо!
6 ответов
Замените все пустые значения на NaN
, затем посчитайте значения notnull
по строке, используя sum(1)
:
df['Chains'] = df.iloc[:,1:].replace('',np.nan).notnull().sum(1)
>>> df
IndividualID Trip1 Trip2 Trip3 Trip4 Trip5 Trip6 Trip7 Trip8 \
0 200100001 23 1.0 2.0 4.0 4.0 1.0 5.0 5.0
1 200100002 21 1.0 12.0 3.0 1.0 55.0 7.0 7.0
2 200100003 12 3.0 3.0 6.0 3.0 NaN NaN NaN
3 200100004 4 NaN NaN NaN NaN NaN NaN NaN
4 200100005 6 5.0 3.0 9.0 3.0 5.0 6.0 NaN
5 200100005 23 4.0 4.0 2.0 4.0 3.0 6.0 5.0
Trip9 Chains
0 5.0 9
1 NaN 8
2 NaN 5
3 NaN 1
4 NaN 7
5 NaN 8
Просто найдите ненулевые элементы, а затем сложите строки:
df['Chains'] = df.notnull().sum(axis=1) - 1
Мне пришлось вычесть один, чтобы учесть ваш IndividualID
столбец. Вот результат, который я получил:
IndividualID Trip1 Trip2 Trip3 Trip4 Trip5 Trip6 Trip7 Trip8 Trip9 Chains
0 200100001 23 1.0 2.0 4.0 4.0 1.0 5.0 5.0 5.0 9
1 200100002 21 1.0 12.0 3.0 1.0 55.0 7.0 7.0 NaN 8
2 200100003 12 3.0 3.0 6.0 3.0 NaN NaN NaN NaN 5
3 200100004 4 NaN NaN NaN NaN NaN NaN NaN NaN 1
4 200100005 6 5.0 3.0 9.0 3.0 5.0 6.0 NaN NaN 7
5 200100005 23 4.0 4.0 2.0 4.0 3.0 6.0 5.0 NaN 8
Пока мы даем альтернативы, если значения NaN
df['cat'] = (~np.isnan(df.set_index('IndividualID').values)).sum(1)
IndividualID
200100001 9
200100002 8
200100003 5
200100004 1
200100005 7
200100005 8
Может быть:
>>> df.replace('',pd.np.nan).count(axis=1)-1
0 9
1 8
2 5
3 1
4 7
5 8
dtype: int64
Или если nan
сделать:
>>> df.count(axis=1)-1
0 9
1 8
2 5
3 1
4 7
5 8
dtype: int64
И просто сделайте:
df['Chains'] = ...
Для присвоения его столбцу
Используйте iloc
и count
, который по умолчанию игнорирует NaN
:
df.iloc[:, 1:].count(1)
0 9
1 8
2 5
3 1
4 7
5 8
dtype: int64
Если значения не NaN
, просто замените пустую строку на NaN
:
df.iloc[:, 1:].replace('', np.nan).count(1)
С помощью
df.ne('').sum(1)-1
Out[287]:
0 9
1 8
2 5
3 1
4 7
5 8
dtype: int64
Если это NaN, используя info
df.iloc[:,1:].T.info()
<class 'pandas.core.frame.DataFrame'>
Index: 9 entries, Trip1 to Trip9
Data columns (total 6 columns):
0 9 non-null float64
1 8 non-null float64
2 5 non-null float64
3 1 non-null float64
4 7 non-null float64
5 8 non-null float64
dtypes: float64(6)
memory usage: 504.0+ bytes
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.