有没有一种更清洁的方式在表格上进行此类测试,例如空值,唯一值等,并将结果放入新的数据框。这段代码对我有用,但是我相信有更好的方法来实现它。
输入:
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]
将来,我想将其扩展到包括对列的其他测试,并想知道在熊猫中做正确的方法是什么
UPD:另一个问题:如何将每个唯一值的计数添加到该测试中?
答案 0 :(得分:1)
一个想法是使用字典来定义列名和相关函数:
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]
要获得更实用的解决方案,您可以使用operator
模块:
from operator import attrgetter, methodcaller
d = {'Nullity %': lambda x: 100*(1-x.count()/len(x.index)),
'Type': attrgetter('dtype'),
'Unique Values': methodcaller('unique')}