使用 python pandas 过滤该数据帧列中的行值

问题描述 投票:0回答:1

我对使用 Pandas 进行 Python 转换世界非常陌生!我来这里是为了问一些我自己遇到的代码问题。 就我而言,我使用 python pandas 过滤行值而不消除它们 - 就像只是选择它们而不从该数据框列中的数据框列中删除它们。然而,在该数据帧列中由混合浮点数(超过2位小数的值)和整数(仅包含一位小数,输出为

x.0
) 对于这个数据框列,在 python pandas 数据框中,它默认假设该列的数据类型为
float64
,所以我很难使用
isinstance()
和替代函数/方法来确定/过滤这种类型的混合数据类型列,而无需消除不需要的值

下面是我的数据集的模拟,其结构来自数据框:

data = {
'time: [00.00.01,00.00.02,00.00.03,00.00.04,00.00.05,00.00.06,00.00.07,00.00.08,00.00.09,00.00.10,00.00.11,00.00.12,
00.00.13,00.00.14,00.00.15,00.00.16,00.00.17,00.00.18,00.00.19,00.00.20,00.00.21,00.00.22,00.00.23,00.00.24],
'value': [1.234, 2.345, 3.456, 4.567, 5.678, 6.789,1,2,3,4,5,6,1.234, 2.345, 3.456, 4.567, 5.678, 6.789,1,2,3,4,5,6]
data = pd.DataFrame(data)

当打印为数据框时,数据看起来像:

> time value
1 00.00.1 1.234
2 00.00.2 2.345
3 00.00.3 3.456
4 00.00.4 4.567
5 00.00.5 5.678
6 00.00.6 6.789
7 00.00.7 1.0
8 00.00.8 2.0
9 00.00.9 3.0
10 00.00.10 4.0
11 00.00.11 5.0
12 00.00.12 6.0
13 00.00.13 1.234
14 00.00.14 2.345
15 00.00.15 3.456
16 00.00.16 4.567
17 00.00.17 5.678
18 00.00.18 6.789
19 00.00.19 1.0
20 00.00.10 2.0
21 00.00.21 3.0
22 00.00.22 4.0
23 00.00.23 5.0
24 00.00.24 6.0

我已尝试使用以下解决方案来解决此问题。 -我的解决方案- 这将删除只有一位小数的值,同时保留多于一位小数的值。

value = data[(data['value'].astype(str).str.split('.').str[1].str.len()>1)]

打印输出可能类似于:

> time value
0 00.00.1 1.234
1 00.00.2 2.345
2 00.00.3 3.456
3 00.00.4 4.567
4 00.00.5 5.678
5 00.00.6 6.789
13 00.00.13 1.234
14 00.00.14 2.345
15 00.00.15 3.456
16 00.00.16 4.567
17 00.00.17 5.678
18 00.00.18 6.789

我期望数据帧可以得到这样的结果,而不会消除任何不需要的行值,即使正在经历过滤器以仅选择只有一位小数的值:

> time value
1 00.00.1 1.234
2 00.00.2 2.345
3 00.00.3 3.456
4 00.00.4 4.567
5 00.00.5 5.678
6 00.00.6 6.789
7 00.00.7 1.0
8 00.00.8 2.0
9 00.00.9 3.0
10 00.00.10 4.0
11 00.00.11 5.0
12 00.00.12 6.0
13 00.00.13 1.234
14 00.00.14 2.345
15 00.00.15 3.456
16 00.00.16 4.567
17 00.00.17 5.678
18 00.00.18 6.789
19 00.00.19 1.0
20 00.00.10 2.0
21 00.00.21 3.0
22 00.00.22 4.0
23 00.00.23 5.0
24 00.00.24 6.0

我真的需要你的帮助来解决这个问题,提前致谢!

python pandas dataframe decimal transformation
1个回答
0
投票

你想要什么真的不清楚:

过滤行值而不消除它们 - 就像只是选择它们而不从数据框列中删除它们。

在这种情况下,只需使用布尔掩码,而不从数据框中选择数据:

m = data['value'].ne(data['value'].round())

输出:

# boolean mask
>>> m
1      True
2      True
3      True
4      True
5      True
6      True
7     False
8     False
9     False
10    False
11    False
12    False
13     True
14     True
15     True
16     True
17     True
18     True
19    False
20    False
21    False
22    False
23    False
24    False
Name: value, dtype: bool

# selection
>>> data[m]
        time  value
1    00.00.1  1.234
2    00.00.2  2.345
3    00.00.3  3.456
4    00.00.4  4.567
5    00.00.5  5.678
6    00.00.6  6.789
13  00.00.13  1.234
14  00.00.14  2.345
15  00.00.15  3.456
16  00.00.16  4.567
17  00.00.17  5.678
18  00.00.18  6.789
© www.soinside.com 2019 - 2024. All rights reserved.