检查pandas中列的数据类型

时间:2017-10-25 06:12:25

标签: python pandas dataframe types

我有一个excel文件,我将其导入为pandas数据帧。

我的数据框df

id    name    value
1      abc     22.3
2      asd     11.9
3      asw     2.4

我的格式为d字典:

{ 'name' : 'str',
  'value' : 'float64',
  'id' : 'int64'}

我想检查数据框中列的数据类型是否与字典中定义的相同。

输出可以只是一个字符串,如果所有列都有各自的数据类型,

print("Success")
else:
    print(" column id has different data type.Please check your file)"

3 个答案:

答案 0 :(得分:3)

致电dtypes,转换为字典并进行比较。

d1 = df.dtypes.astype(str).to_dict()

d1
{'id': 'int64', 'name': 'object', 'value': 'float64'}

d1 == {'name' : 'str', 'value' : 'float64', 'id' : 'int64'}
False 

不幸的是,name列显示的是object列,而不是str,因此False。我建议您快速迭代你的字典并将str出现的所有条目更改为object(这不应该受到伤害):

d2 = {k : 'object' if v == 'str' else v for k, v in d2.items()}

d2
{'id': 'int64', 'name': 'object', 'value': 'float64'}

d1 == d2
True

要检查哪些列不正确,解决方案会变得更加复杂,但对于列表理解仍然非常容易。

[k for k in d1 if d1[k] != d2.get(k)] 
['name']

答案 1 :(得分:1)

使用

In [5763]: df
Out[5763]:
   id name  value
0   1  abc   22.3
1   2  asd   11.9
2   3  asw    2.4

In [5764]: d
Out[5764]: {'id': 'int64', 'name': 'str', 'value': 'float64'}

详细

void regenerateId()
{
    System.Web.SessionState.SessionIDManager manager = new System.Web.SessionState.SessionIDManager();
    string oldId = manager.GetSessionID(Context);
    string newId = manager.CreateSessionID(Context);
    bool isAdd = false, isRedir = false;
    manager.SaveSessionID(Context, newId, out isRedir, out isAdd);
    HttpApplication ctx = (HttpApplication)HttpContext.Current.ApplicationInstance;
    HttpModuleCollection mods = ctx.Modules;
    System.Web.SessionState.SessionStateModule ssm = (SessionStateModule)mods.Get("Session");
    System.Reflection.FieldInfo[] fields = ssm.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    SessionStateStoreProviderBase store = null;
    System.Reflection.FieldInfo rqIdField = null, rqLockIdField = null, rqStateNotFoundField = null;
    foreach (System.Reflection.FieldInfo field in fields)
    {
        if (field.Name.Equals("_store")) store = (SessionStateStoreProviderBase)field.GetValue(ssm);
        if (field.Name.Equals("_rqId")) rqIdField = field;
        if (field.Name.Equals("_rqLockId")) rqLockIdField = field;
        if (field.Name.Equals("_rqSessionStateNotFound")) rqStateNotFoundField = field;
    }
    object lockId = rqLockIdField.GetValue(ssm);
    if ((lockId != null) && (oldId !=null)) store.ReleaseItemExclusive(Context, oldId, lockId);
    rqStateNotFoundField.SetValue(ssm, true);
    rqIdField.SetValue(ssm, newId);
}

答案 2 :(得分:0)

您可以将列中第一个值的type转换为str,然后进行比较:

d1 = {x: type(df[x].iat[0]).__name__ for x in df.columns}
print (d1)
{'name': 'str', 'id': 'int64', 'value': 'float64'}

print (d == d1)
True