【问题标题】:Pandas DataFrame : filter column / index by typePandas DataFrame:按类型过滤列/索引
【发布时间】:2021-01-14 20:22:28
【问题描述】:

这是交易,

我正在从不一致的 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 ? 谢谢。

【问题讨论】:

  • 您可以将type(df.loc[selected_row, column)isinstance() 方法结合使用。

标签: python pandas dataframe data-cleaning


【解决方案1】:

将列转换为日期时间并使用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)

【讨论】:

  • 那么~有什么用?
  • ~ 用于否定stackoverflow.com/questions/46054318/…pd.to_datetime(df.index, errors='coerce').isnull() 查找有空值的位置。但正如我们想要的那样,它不为空 ~ 被使用
【解决方案2】:

让我们创建一个带有索引范围和日期范围的小示例:

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

现在您可以像这样选择取消类型信息:

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

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

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 2022-06-20
    • 2021-09-05
    • 2014-05-18
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多