在熊猫数据框的每一列上进行多次探索性测试

时间:2018-10-16 08:18:34

标签: 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.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:另一个问题:如何将每个唯一值的计数添加到该测试中?

1 个答案:

答案 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')}