Python 在数据帧中创建唯一值列表--错误:TypeError:'<';在';int';和';str';

Python 在数据帧中创建唯一值列表--错误:TypeError:'<';在';int';和';str';,python,pandas,numpy,dataframe,group-by,Python,Pandas,Numpy,Dataframe,Group By,我有一个数据集,看起来像这样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 ==

我有一个数据集,看起来像这样
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回溯(最近一次调用)
在里面
14 df
15
--->16 df.groupby(['Name'])[col].apply(lambda x:list(np.unique(x)))
17
18
应用中的~/miniconda3/envs/planning/lib/python3.7/site-packages/pandas/core/groupby/groupby.py(self、func、*args、**kwargs)
735
736具有_组_选择_上下文(自身):
-->737返回自我。\u python\u应用\u常规(f)
738
739返回结果
~/miniconda3/envs/planning/lib/python3.7/site-packages/pandas/core/groupby/groupby.py在python应用程序中(self,f)
740
741定义python应用常规(自我,f):
-->742个键,值,mutated=self.grouper.apply(f,self.\u selected\u obj,self.axis)
743
744返回自包装应用输出(
应用中的~/miniconda3/envs/planning/lib/python3.7/site-packages/pandas/core/groupby/ops.py(self、f、data、axis)
235#组可能会被修改
236组_轴=_获取_轴(组)
-->237 res=f(组)
238如果不是,则与索引类似(res,组轴):
239突变=真
in(x)
14 df
15
--->16 df.groupby(['Name'])[col].apply(lambda x:list(np.unique(x)))
17
18
唯一(*args,**kwargs)
~/miniconda3/envs/planning/lib/python3.7/site-packages/numpy/lib/arraysetops.py唯一(ar、返回索引、返回逆、返回计数、轴)
260 ar=北阿桑亚雷(ar)
261如果轴为无:
-->262 ret=_unique1d(ar、返回索引、返回逆、返回计数)
263返回_解包_元组(ret)
264
unique1d中的~/miniconda3/envs/planning/lib/python3.7/site-packages/numpy/lib/arraysetops.py(ar、返回索引、返回逆、返回计数)
308 aux=ar[perm]
309其他:
-->310 ar.sort()
311 aux=ar
312掩码=np.empty(辅助形状,数据类型=np.bool\ux)

TypeError:“这可以通过
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
那么:

df.T.drop_重复项(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
编辑:


此解决方案涉及问题的第一个版本,几乎不需要做什么就可以将其应用到最后一个版本。

在所需的输出中,为什么列
x_3
中的最后一个值不是
3/15/2015
?因为只应返回唯一的值。列x_3不是必需的,因此我将删除它。在整个Da中是唯一的taFrame或在列中?行中唯一。很抱歉,以前有点混淆。现在修复。谢谢。这确实有效。我想知道您是否可以添加一些信息,说明为什么选择melt和pivot而不是直接转到groupby。换句话说,我为什么会出现错误:
TypeError:'