Pandas DataFrame:按类型过滤列/索引
Pandas DataFrame : filter column / index by type
这是交易,
我正在从一个不一致的 MongoDB 集合中检索数据,所以我想 删除索引 不是日期时间的行 输入.
例如删除此 DataFrame 的前 5 行:
_id id ... open connected
updated ...
Timestamp(0, 1610620202) 60001de14ed34a02743c4547 27 ... 1 1
1610620382 60001de14ed34a02743c4548 5 ... 1 1
1610620202 60001de14ed34a02743c4549 24 ... 1 1
1610620382 60001de14ed34a02743c454a 17 ... 1 1
1610620201 60001de14ed34a02743c454b 1 ... 1 1
... ... .. ... ... ...
2021-01-14 20:12:01 6000a60cc299a51c09e20626 19 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20627 21 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20628 11 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20629 16 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e2062a 14 ... 1 1
此外,我如何找到给定单元格中使用的精确 type?
谢谢
将列转换为日期时间并使用errors='coerce'
将非日期时间类型标记为NaT
然后您可以过滤掉不为空的行
df[~pd.to_datetime(df.index, errors='coerce').isnull()]
_id id
updated
2021-01-14 20:12:01 6000a60cc299a51c09e20626 19
2021-01-14 20:12:01 6000a60cc299a51c09e20627 21
2021-01-14 20:12:01 6000a60cc299a51c09e20628 11
2021-01-14 20:12:01 6000a60cc299a51c09e20629 16
2021-01-14 20:12:01 6000a60cc299a51c09e2062a 14
要知道整列的数据类型你可以做
df['_id'].apply(type)
如果是索引,你可以这样做
pd.Series(df.index.values).apply(type)
让我们创建一个带有索引范围和日期范围的小示例:
df = pd.DataFrame({'a':[1,2,3]})
df2 = pd.DataFrame({'a':[4,5,6]}, index=pd.date_range('2020-01-01', '2020-01-03', freq='D'))
df_select = df.append(df2)
>>> df_select
a
0 1
1 2
2 3
2020-01-01 00:00:00 4
2020-01-02 00:00:00 5
2020-01-03 00:00:00 6
现在您可以select像这样取消类型信息:
df_select[[isinstance(item, pd.Timestamp) for item in df_select.index.values]]
>>>
a
2020-01-01 00:00:00 4
2020-01-02 00:00:00 5
2020-01-03 00:00:00 6
希望这是解决您问题的方法。
这是交易,
我正在从一个不一致的 MongoDB 集合中检索数据,所以我想 删除索引 不是日期时间的行 输入.
例如删除此 DataFrame 的前 5 行:
_id id ... open connected
updated ...
Timestamp(0, 1610620202) 60001de14ed34a02743c4547 27 ... 1 1
1610620382 60001de14ed34a02743c4548 5 ... 1 1
1610620202 60001de14ed34a02743c4549 24 ... 1 1
1610620382 60001de14ed34a02743c454a 17 ... 1 1
1610620201 60001de14ed34a02743c454b 1 ... 1 1
... ... .. ... ... ...
2021-01-14 20:12:01 6000a60cc299a51c09e20626 19 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20627 21 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20628 11 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e20629 16 ... 1 1
2021-01-14 20:12:01 6000a60cc299a51c09e2062a 14 ... 1 1
此外,我如何找到给定单元格中使用的精确 type? 谢谢
将列转换为日期时间并使用errors='coerce'
将非日期时间类型标记为NaT
然后您可以过滤掉不为空的行
df[~pd.to_datetime(df.index, errors='coerce').isnull()]
_id id
updated
2021-01-14 20:12:01 6000a60cc299a51c09e20626 19
2021-01-14 20:12:01 6000a60cc299a51c09e20627 21
2021-01-14 20:12:01 6000a60cc299a51c09e20628 11
2021-01-14 20:12:01 6000a60cc299a51c09e20629 16
2021-01-14 20:12:01 6000a60cc299a51c09e2062a 14
要知道整列的数据类型你可以做
df['_id'].apply(type)
如果是索引,你可以这样做
pd.Series(df.index.values).apply(type)
让我们创建一个带有索引范围和日期范围的小示例:
df = pd.DataFrame({'a':[1,2,3]})
df2 = pd.DataFrame({'a':[4,5,6]}, index=pd.date_range('2020-01-01', '2020-01-03', freq='D'))
df_select = df.append(df2)
>>> df_select
a
0 1
1 2
2 3
2020-01-01 00:00:00 4
2020-01-02 00:00:00 5
2020-01-03 00:00:00 6
现在您可以select像这样取消类型信息:
df_select[[isinstance(item, pd.Timestamp) for item in df_select.index.values]]
>>>
a
2020-01-01 00:00:00 4
2020-01-02 00:00:00 5
2020-01-03 00:00:00 6
希望这是解决您问题的方法。