У меня есть такой фрейм данных:

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

Есть ли возможные решения? Буду очень признателен, если кто-то может помочь с этим! Заранее спасибо!

9
Steward 21 Авг 2018 в 03:47

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  
3
sacuL 21 Авг 2018 в 00:52

Просто найдите ненулевые элементы, а затем сложите строки:

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
3
chrisaycock 21 Авг 2018 в 00:51

Пока мы даем альтернативы, если значения 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
2
rafaelc 21 Авг 2018 в 01:12

Может быть:

>>> 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'] = ...

Для присвоения его столбцу

2
U10-Forward 21 Авг 2018 в 01:15

Используйте 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)
5
user3483203 21 Авг 2018 в 00:52

С помощью

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
5
YOBEN_S 21 Авг 2018 в 00:57
51940179