python - 使用 pandas 解析和编辑 csv

标签 python pandas data-science

我正在尝试解析 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/

相关文章:

python - 使用 Pandas 计算不规则时间序列的每日平均值

python - 如何在巨大的数据集中查找和转换 pandas 数据框中的缺失值?

python - Sklearn K表示Clustering convergence

python - 有/没有事先编译的 exec 语句

python 从 pandas 数据框中的数组中查找元素

python - 在Pandas to_csv函数中,我需要将标题的分隔符修改为 ":"

Python: Unstacked DataFrame 太大,导致 int32 溢出

python - 在 Python 中使用 sklearn 使用 MAE 训练线性模型

python - 添加随机字节如何*增加*重复项?

python - 使用tesseract和opencv进行python字符串比较