Python 对数据帧的每一列执行多个探索性测试
是否有一种更干净的方法可以对表进行此类测试,例如空值、唯一值等,并将结果放入新的数据帧中。这段代码对我来说很有用,但我相信有更好的方法 输入:Python 对数据帧的每一列执行多个探索性测试,python,pandas,Python,Pandas,是否有一种更干净的方法可以对表进行此类测试,例如空值、唯一值等,并将结果放入新的数据帧中。这段代码对我来说很有用,但我相信有更好的方法 输入: lvl1 = ['A','A','A','A','A','B','B','B','B',np.nan ] lvl2 = ['foo','foo','bar','bar','bar','foo','foo','foo','bar','bar'] df = pd.DataFrame({ 'L1' : lvl1, 'L2' : lvl2}) df.appl
lvl1 = ['A','A','A','A','A','B','B','B','B',np.nan ]
lvl2 = ['foo','foo','bar','bar','bar','foo','foo','foo','bar','bar']
df = pd.DataFrame({ 'L1' : lvl1, 'L2' : lvl2})
df.apply(lambda x: [ 100*(1-x.count()/len(x.index)),x.dtype,x.unique()],result_type='expand').T.rename(index=str, columns={0: "Nullity %", 1: "Type",2:"Unique Values"})
输出
Nullity % Type Unique Values
L1 10 object [A, B, nan]
L2 0 object [foo, bar]
在将来,我想扩展它,包括对列的其他测试,并想知道在pandas中做这件事的正确方法是什么
UPD:附加问题:如何将每个唯一值的计数添加到此测试中?一种方法是使用字典定义列名和相关函数:
d = {'Nullity %': lambda x: 100*(1-x.count()/len(x.index)),
'Type': lambda x: x.dtype,
'Unique Values': lambda x: x.unique()}
res = pd.DataFrame([{name: func(df[col]) for name, func in d.items()} for col in df],
index=df.columns)
print(res)
Nullity % Type Unique Values
L1 10.0 object [A, B, nan]
L2 0.0 object [foo, bar]
要获得更实用的解决方案,您可以使用操作员
模块:
from operator import attrgetter, methodcaller
d = {'Nullity %': lambda x: 100*(1-x.count()/len(x.index)),
'Type': attrgetter('dtype'),
'Unique Values': methodcaller('unique')}
您能给出一个输入和预期输出的示例吗?
df.descripe()
不能满足您的要求?@bakkadf.descripe()
不能给我空值、类型或唯一值您当前的解决方案有什么问题?对我来说似乎很好。@jpp这是一个由不同代码片段组成的弗兰肯斯坦,我仍然在想它是如何工作的。例如,如何从一开始就定义列名,而不必在以后重命名?非常感谢!尽管如此,我还是会坚持我的解决方案,因为它要少得多verbose@hashimov,将所有内容放在一行并不意味着“不那么冗长”!我的意思是它更容易复制/粘贴供我日常使用