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:'