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

希望这是解决您问题的方法。