Python Pandas 使用各种数据类型进行切片

Posted

技术标签:

【中文标题】Python Pandas 使用各种数据类型进行切片【英文标题】:Python Pandas slicing with various datatypes 【发布时间】:2020-03-28 10:10:00 【问题描述】:

我在数据框中有一列有两种数据类型,如下所示:

25                3037205
26    2019-09-04 19:54:57
27    2019-09-09 17:55:45
28    2019-09-16 21:40:36
29                3037206
30    2019-09-06 14:49:41
31    2019-09-11 17:17:11
32                3037207
33    2019-09-11 17:19:04

我正在尝试对其进行切片并构建一个新的数据框,如下所示:

26    3037205    2019-09-04 19:54:57
27    3037205    2019-09-09 17:55:45
28    3037205    2019-09-16 21:40:36
29    3037206    2019-09-06 14:49:41
30    3037206    2019-09-11 17:17:11
31    3037207    2019-09-11 17:19:04

我找不到如何在“无日期类型”的数字之间进行切片。

一些想法?

谢谢!

【问题讨论】:

I can't find how to slice between numbers “no datetype” 是什么意思?那是错误消息的一部分吗? 【参考方案1】:

另一种方法:

s = pd.to_numeric(df['col1'], errors='coerce')
df.assign(val=s.ffill().astype(int)).loc[s.isnull()]

输出:

                   col1      val
26  2019-09-04 19:54:57  3037205
27  2019-09-09 17:55:45  3037205
28  2019-09-16 21:40:36  3037205
30  2019-09-06 14:49:41  3037206
31  2019-09-11 17:17:11  3037206
33  2019-09-11 17:19:04  3037207

【讨论】:

您好,这会返回一个错误:“ValueError: Cannot convert non-finite values (NA or inf) to integer”【参考方案2】:

我不确定这是否是解决问题的最有效方法,但它似乎可以完成工作。我在 #:

之后添加了重命名第二列的选项(因为未指定其名称)
import pandas as pd
import numpy as np
data = 'dates':[3037205,'2019-09-04 19:54:57','2019-09-09 17:55:45','2019-09-16 21:40:36',3037206,'2019-09-06 14:49:41','2019-09-11 17:17:11',3037207,'2019-09-11 17:19:04']

df = pd.DataFrame(data)

df['mask'] = np.where(df['dates'].str.isnumeric(),df['dates'],np.nan)
df['mask_2'] = np.where(df['dates'].str.isnumeric(),np.nan,df['dates'])
df['mask'] = df['mask'].fillna(method='ffill')
df = df.dropna(subset=['mask_2']).drop(columns=['mask_2'])#.rename(columns='mask':'desired_name')
print(df)

输出:

                 dates     mask
1  2019-09-04 19:54:57  3037205
2  2019-09-09 17:55:45  3037205
3  2019-09-16 21:40:36  3037205
5  2019-09-06 14:49:41  3037206
6  2019-09-11 17:17:11  3037206
8  2019-09-11 17:19:04  3037207

【讨论】:

df.dropna(how='any') 非常危险,因为数据仅代表 OP 中的一列。 确实如此。但是数据的结构似乎没有遵循这个问题,因为有一个id 类型的值,然后是一定数量的日期,等等......如果id 值包含字符串,则会出现主要问题,因此使 mask 列包含 NaN 值。 我想说主要问题不是dropna(),而是np.where(),因为第一个问题是基于后一个问题。我想听听您对此的看法,因为我是初学者,这类讨论对我非常有用。 不,如前所述,您的解决方案可以正常工作。但是,我在本文未提及的其他列中谈论nan。通过df.dropna(how='any'),您可能会删除带有这些nan 的行,即使它们在此列中是实际的datetime 你是对的,我将子集添加到dropna。我假设 OP 提供的信息是完整的数据帧。感谢您的反馈意见。这些是我真正喜欢学习的经验丰富的程序员和初学者之间的区别!

以上是关于Python Pandas 使用各种数据类型进行切片的主要内容,如果未能解决你的问题,请参考以下文章

当尝试对 pandas 数据帧进行切片时,它会引发“ValueError('Lengths must match to compare')”

停止使用 Pandas get_dummies() 进行特征编码

python-pandas-1

python 数据分析--数据处理工具Pandas

《利用Python 进行数据分析》 - 笔记

像Excel一样使用Python(一)