gpt4 book ai didi

python - 使用 pandas 解析和编辑 csv

转载 作者:行者123 更新时间:2023-12-01 01:23:42 25 4
gpt4 key购买 nike

我正在尝试解析 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 个 header 的整个 CSV,忽略所有字符串并舍入 float 以匹配列表。有没有一种简单的方法可以用 Pandas 实现这一点?是否可以(或一个好主意?)让它编辑现有的 Excel 工作簿,而不是创建一个我必须复制/粘贴的新 csv?

任何帮助或建议将不胜感激,因为我对 Pandas 很陌生,而且这真是太可怕了!

最佳答案

如果您包含您尝试解析的数据的示例模拟,那么帮助会容易得多。据我了解,澄清您未指定的要点

  • “带有 n 个标题的整个 CSV,忽略所有字符串并舍入 float 以匹配列表”,您的意思是一些带有 k 的 n 列数据帧 数字列,每个数字列描述某人的高度(以英寸为单位)。
  • 数字列中的条目以英尺为单位。
  • 您想要忽略非数字列并将数据转换为 6.14 -> 6 英尺 1 英寸(我隐含地假设通过“向下舍入”您想要一个整数下限; 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

关于python - 使用 pandas 解析和编辑 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53543369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com