尝试用float划分数据帧列会产生NaN

时间:2016-12-30 21:22:55

标签: python csv pandas division

背景 我处理一个打印出数字列的csv数据表。我正在开发一个程序,该程序将采用第一列,向用户询问浮动时间(即45小时半= 45.5),然后从第一列中减去该数字。我在这方面取得了成功。现在,我需要找到“零”时间点的行索引。我用min来找到那个索引,然后从下面的A1列调用它。我需要在时间0找到读数然后将A1标准化,以便在图表上,在0时间点,A1列中的读数为1(最后所有后续列,但对我来说是婴儿步骤)

time_zero = float(input("Which time would you like to be set to 0?"))
df['A1']= df['A1']-time_zero

到目前为止,这可以正常设置零时间。

zero_location_series = df[df['A1'] == df['A1'].min()]
r1 = zero_location_series[' A1.1']
df[' A1.1'] = df[' A1.1']/r1

这是我遇到麻烦的地方。第一行将正确识别我可以为所有其他列提取的系列。下一个r1正确识别正确的A1.1值,当我使用type(r1)时,此值为浮点数。 但是,当我除df[' A1.1']/r1时,它只产生一个正确的值,而该值是r1/r1 = 1的位置。所有其他值都来自NaN

我的问题:

  1. 我猜怎么用浮点划分列?我为什么要NaN
  2. 有没有更快的方法来执行此操作,因为我需要为16列执行此操作。(即'A2 / r2''a3 / r3'等)
  3. 在重新保存数据之前,我是否需要在任何地方进行inplace = True以使操作成为可能?或者仅用于添加/删除行?
  4. 示例

    看起来像这样的数据框 !http://i.imgur.com/ObUzY7p.png 零时间设置正确(图像未显示)

    分割柱后

    http://i.imgur.com/TpLUiyE.png

2 个答案:

答案 0 :(得分:1)

这应该有效:

df['A1.1']=df['A1.1']/df['A1.1'].min()

我认为df[' A1.1'] = df[' A1.1']/r1无效的原因是因为r1是一个系列。尝试使用r1?代替type(r1),pandas会告诉您r1是一个系列,而不是单个浮点数。

要一次尝试,你必须迭代每一列,如下所示:

for c in df:
    df[c] = df[c]/df[c].min()

答案 1 :(得分:0)

如果您想将列中的每个值除以r1,最好应用,例如:

import pandas as pd
df = pd.DataFrame([1,2,3,4,5])
# apply an anonymous function to the first column ([0]), divide every value
# in the column by 3
df = df[0].apply(lambda x: x/3.0, 0)
print(df)

所以你可能想要这样的东西:

df = df["A1.1"].apply(lambda x: x/r1, 0)

这真的只回答你问题的第2部分。应用可能是您快速在多行和多列上运行函数的最佳选择。至于你为什么在划分浮点数时得到nans,你的列中的值是否可能是浮点数或整数以外的值?