Создать список уникальных значений в панде dataframe - ошибка: TypeError: '<' не поддерживается между экземплярами 'int' и 'str' - PullRequest
0 голосов
/ 29 октября 2019

У меня есть набор данных, который выглядит следующим образом df:

import pandas as pd
import numpy as np

df = pd.DataFrame(data={'Name':['a','b','c','d'],'1/1/2001': 
['1/1/2015',0,0,'1/1/2015'],'2/20/2002': 
['2/20/2002','2/20/2002','2/20/2002',0],'3/15/2015' 
[0,0,0,'3/15/2015']}); df

df[df == 0] = np.nan
col = ['1/1/2001','2/20/2002','3/15/2015']
df.loc[:,col] = df.loc[:,col].bfill(axis=1)
df = df.fillna(value=0)

df

    Name    1/1/2001    2/20/2002   3/15/2015
0   a       1/1/2015    2/20/2002   0
1   b       2/20/2002   2/20/2002   0
2   c       2/20/2002   2/20/2002   0
3   d       1/1/2015    3/15/2015   3/15/2015

И я хочу вернуть фрейм данных, который имеет только уникальные значения в строке, поэтому он может выглядеть следующим образом:

    Name    x_          x_2        
0   a       1/1/2015    2/20/2002   
1   b       2/20/2002   0           
2   c       2/20/2002   0           
3   d       1/1/2015    3/15/2015   

Но когда я пытаюсь сгруппировать следующий код:

df.groupby(['Name'])[col].apply(lambda x: list(np.unique(x)))

я получаю длинную ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-155-a3f3c8a3e6e5> in <module>
     14 df
     15 
---> 16 df.groupby(['Name'])[col].apply(lambda x: list(np.unique(x)))
     17 
     18 

~/miniconda3/envs/planting/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in apply(self, func, *args, **kwargs)
    735 
    736                 with _group_selection_context(self):
--> 737                     return self._python_apply_general(f)
    738 
    739         return result

~/miniconda3/envs/planting/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _python_apply_general(self, f)
    740 
    741     def _python_apply_general(self, f):
--> 742         keys, values, mutated = self.grouper.apply(f, self._selected_obj, self.axis)
    743 
    744         return self._wrap_applied_output(

~/miniconda3/envs/planting/lib/python3.7/site-packages/pandas/core/groupby/ops.py in apply(self, f, data, axis)
    235             # group might be modified
    236             group_axes = _get_axes(group)
--> 237             res = f(group)
    238             if not _is_indexed_like(res, group_axes):
    239                 mutated = True

<ipython-input-155-a3f3c8a3e6e5> in <lambda>(x)
     14 df
     15 
---> 16 df.groupby(['Name'])[col].apply(lambda x: list(np.unique(x)))
     17 
     18 

<__array_function__ internals> in unique(*args, **kwargs)

~/miniconda3/envs/planting/lib/python3.7/site-packages/numpy/lib/arraysetops.py in unique(ar, return_index, return_inverse, return_counts, axis)
    260     ar = np.asanyarray(ar)
    261     if axis is None:
--> 262         ret = _unique1d(ar, return_index, return_inverse, return_counts)
    263         return _unpack_tuple(ret)
    264 

~/miniconda3/envs/planting/lib/python3.7/site-packages/numpy/lib/arraysetops.py in _unique1d(ar, return_index, return_inverse, return_counts)
    308         aux = ar[perm]
    309     else:
--> 310         ar.sort()
    311         aux = ar
    312     mask = np.empty(aux.shape, dtype=np.bool_)

TypeError: '<' not supported between instances of 'int' and 'str'

Возможно, ошибка связана с тем, чтодаты являются строками. Если это полезно, они могут быть преобразованы в объекты даты и времени.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

как насчет:

df.T.drop_duplicates(keep='first').T

вывод:

   1/1/2001  2/20/2002  3/15/2015 Name
0  1/1/2015  2/20/2002          0    a
1         0  2/20/2002          0    b
2         0  2/20/2002          0    c
3  1/1/2015          0  3/15/2015    d

РЕДАКТИРОВАТЬ:

Это решение относится к первой версиивопрос, мало что нужно сделать, чтобы применить его к последней версии.

0 голосов
/ 29 октября 2019

Это можно сделать с помощью melt, затем pivot

s=df.mask(df==0).melt('Name').drop_duplicates(['Name','value']).dropna()

s['row']=s.groupby('Name').cumcount()+1
s.pivot(index='Name',columns='row',values='value')
Out[76]: 
row           1          2
Name                      
a      1/1/2015  2/20/2002
b     2/20/2002        NaN
c     2/20/2002        NaN
d      1/1/2015  3/15/2015
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...