python - 使用 pandas 解析和编辑 csv
问题描述
我正在尝试解析 csv 文件中表示高度的所有单元格,并四舍五入小数点后的内容以匹配列表中的数字(向下舍入到最接近的英寸)。经过几天我的头撞墙后,这是我能够开始工作的编码:
import math
import pandas as pd
inch = [.0, .08, .16, .25, .33, .41, .50, .58, .66, .75, .83, .91, 1]
df = pd.read_csv("sample_csv.csv")
def to_number(s):
for index, row in df.iterrows():
try:
num = float(s)
num = math.modf(num)
num = list(num)
for i,j in enumerate(inch):
if num[0] < j:
num[0] = inch[i-1]
break
elif num[0] == j:
num[0] = inch[i]
break
newnum = num[0] + num[1]
return newnum
except ValueError:
return s
df = df.apply(lambda f : to_number(f[0]), axis=1).fillna('')
with open('new.csv', 'a') as f:
df.to_csv(f, index=False)
理想情况下,我想让它解析带有 n 个标头的整个 CSV,忽略所有字符串并舍入浮点数以匹配列表。有没有一种简单的(r)方法可以用 Pandas 实现这一目标?是否有可能(或一个好主意?)让它编辑现有的 excel 工作簿而不是创建一个我必须复制/粘贴的新 csv?
任何帮助或建议将不胜感激,因为我对 Pandas 很陌生,而且这该死的吓人!
解决方案
如果您包含您尝试解析的数据的示例模拟,帮助会容易得多。据我了解,澄清您未指定的要点
- 通过“具有n 个标题的整个 CSV,忽略所有字符串并舍入浮点数以匹配列表”,您的意思是一些带有k个数字列的n列数据框,每个列都以英寸为单位描述某人的身高。
- 数字列中的条目以英尺为单位测量。
- 您想忽略非数字列并将数据转换为
6.14 -> 6 feet, 1 inches
(我隐含地假设通过“向下取整”您想要一个整数地板;即6.14 英尺是 6 英尺,0.14*12 = 1.68 英寸;这取决于您是下限还是四舍五入到最接近的整数)。
现在,对于在 5.1 英尺和 6.9 英尺上均匀采样的以英尺为单位测量的随机高度子集,我们可以执行以下操作:
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: df = pd.DataFrame(np.random.uniform(5.1, 6.9, size=(10,3)))
In [4]: df
Out[4]:
0 1 2
0 6.020613 6.315707 5.413499
1 5.942232 6.834540 6.761765
2 5.715405 6.162719 6.363224
3 6.416955 6.511843 5.512515
4 6.472462 5.789654 5.270047
5 6.370964 5.509568 6.113121
6 6.353790 6.466489 5.460961
7 6.526039 5.999284 6.617608
8 6.897215 6.016648 5.681619
9 6.886359 5.988068 5.575993
In [5]: np.fix(df) + np.floor(12*(df - np.fix(df)))/12
Out[5]:
0 1 2
0 6.000000 6.250000 5.333333
1 5.916667 6.833333 6.750000
2 5.666667 6.083333 6.333333
3 6.416667 6.500000 5.500000
4 6.416667 5.750000 5.250000
5 6.333333 5.500000 6.083333
6 6.333333 6.416667 5.416667
7 6.500000 5.916667 6.583333
8 6.833333 6.000000 5.666667
9 6.833333 5.916667 5.500000
我们np.fix
用来提取高度值的整数部分。同样,df - np.fix(df)
当乘以 12 时,表示以英尺或英寸为单位的小数余数。np.floor
只需将其截断到下面最接近的英寸,最后除以 12 即可返回从英寸到英尺的测量单位。
您可以更改np.floor
为np.round
以四舍五入到最接近的英寸而不是截断到前一英寸的答案。最后,您可以指定输出的精度以坚持从您的列表中选择小数部分。
In [6]: (np.fix(df) + np.round(12*(df - np.fix(df)))/12).round(2)
Out[6]:
0 1 2
0 6.58 5.25 6.33
1 5.17 6.42 5.67
2 6.42 5.83 6.33
3 5.92 5.67 6.33
4 6.83 5.25 6.58
5 5.83 5.50 6.92
6 6.83 6.58 6.25
7 5.83 5.33 6.50
8 5.25 6.00 6.83
9 6.42 5.33 5.08
推荐阅读
- r - %>% .$column_name 等效于 R 基管道 |>
- c++ - 如何使 sf::Vector2f transform(float t) 速度更快?
- linux - 无法使用 linux 终端删除 linux 目录
- swift - Swift:“'Any'类型的值没有成员'map'”,数组返回为Any类型
- css - 为什么插入符号会触发 css lint 错误?
- python - Python:检查列表中的每个文件是否存在于目录中
- python - Unstacked DataFrame太大,导致int32溢出
- java - 从图库意图中选择后,图像未显示在图像视图中
- identityserver4 - 如何从 Identity Server 应用程序执行外部身份验证请求?
- computer-vision - CVAT coco 注释 json - iscrowd 选项