在Python中以CSV填充空点

时间:2019-12-27 01:46:10

标签: python pandas

我正在解析一个csv文件来创建图表。我能够做到这一点,没有任何问题,除了在单个情况下...每当csv文件中有空插槽时。例如:

  

Col1 Col2 Col3 Col4 Col5
  45 34 34 23 98 18
  66的25 25的
  18的52的56的100

文件的第2列和第5列中有两个空白条目。我想用0填充这些位置。我对Python还是很陌生。如果csv中有一个空点,我想插入一个0。因为有时我的csv文件中可能有空格,所以出现错误TypeError: unsupported operand type(s) for -: 'int' and 'str'。不得不进入csv文件以检查是否存在空点并手动将其填充为零,这可能很烦人,因此我想在脚本中执行此操作。这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


file_name = "myfile.csv"
df = pd.read_csv(file_name)
names = df['name'].values

x = np.arange(len(names))*2
w = 0.40

col2 = df.columns[1]
col3 = df.columns[2]
col4 = df.columns[3]
col5 = df.columns[4]

dif = df[col4] - df[col3]

colors = ['Red' if d < -5 else 'Blue' for d in dif]

plt.bar(x-w, df[col2].values, width=w*0.7, label=col2, color = "cyan")
plt.bar(x, df[col3].values, width=w*0.7, label=col3, color = "green")
plt.bar(x+w, df[col4].values, width=w*0.7, label=col4, color = colors)
plt.plot(x, df[col5].values, lw=2, label="Goal", color = "red")

plt.xticks(x, names, rotation='vertical')
plt.ylim([0,100])

plt.show()

注意:如上所述,我正在从csv文件读取数据帧。

编辑:

我已将此行添加到我的代码中:

df.replace(r'^\s*$', 0, regex=True)
#For testing purposes, I also added this:
print(df.replace(r'^\s*$', 0, regex=True))

我可以看到空插槽现在填充有零,但是我仍然收到TypeError: unsupported operand type(s) for -: 'str' and 'int'的错误dif = df[col4] - df[col3]。是否有可能将插入0的字符串读取为字符串? 我也曾尝试将df[col3]df[col4]包装在int()中,但是没有运气。它给出错误TypeError: cannot convert the series to <class 'int'>。然后,我尝试了df[col4].astype(int) - df[col3].astype(int),并收到了错误消息ValueError: invalid literal for int() with base 10

编辑2: 我刚刚添加了行print(df.dtypes)。由于某种原因,第四列(在这种情况下,它包含替换为0)被视为对象,而不是像其余各列一样是int64。

2 个答案:

答案 0 :(得分:0)

您必须使用Pandas库提供的replace方法。

这是文档:documentation

您可以使用

df.replace(r'^\s*$', 0, regex=True)

答案 1 :(得分:0)

   import pandas as pd
   file_name = "myfile.csv"
   df = pd.read_csv(file_name)
   # a Pandas method that fills any NaN value with 0, you can change 0 to any value you 
   # want, you can use mean or median, etc
   df.fillna(0, inplace=True)