我有一个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)"
答案 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