尝试将数据框列除以浮点数会产生 NaN
Trying to divide a dataframe column by a float yields NaN
背景
我处理打印出数字列的 csv 数据表。我正在开发一个程序,该程序将占用第一列,向用户询问浮动时间(即 45 个半小时 = 45.5),然后从第一列中减去该数字。我在这方面是成功的。现在,我需要找到 "zero" 时间点的行索引。我使用 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
.
我的问题:
- 我猜如何用浮点数来划分列?为什么我得到
NaN
?
- 是否有更快的方法来执行此操作,因为我需要对 16 列执行此操作。(即 'A2/r2' 'a3/r3' 等)
- 我是否需要在任何地方执行 inplace = True 以使操作在重新保存数据之前保持不变?还是仅适用于 adding/deleting 行?
例子
看起来像这样的数据框
!http://i.imgur.com/ObUzY7p.png
零时间设置正确(图像未显示)
如果要将列中的每个值除以 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 部分。 Apply 可能是 运行 快速处理多个行和列的函数的最佳选择。至于为什么在除以浮点数时得到 nans,列中的值是否可能不是浮点数或整数?
这应该有效:
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()
背景 我处理打印出数字列的 csv 数据表。我正在开发一个程序,该程序将占用第一列,向用户询问浮动时间(即 45 个半小时 = 45.5),然后从第一列中减去该数字。我在这方面是成功的。现在,我需要找到 "zero" 时间点的行索引。我使用 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
.
我的问题:
- 我猜如何用浮点数来划分列?为什么我得到
NaN
? - 是否有更快的方法来执行此操作,因为我需要对 16 列执行此操作。(即 'A2/r2' 'a3/r3' 等)
- 我是否需要在任何地方执行 inplace = True 以使操作在重新保存数据之前保持不变?还是仅适用于 adding/deleting 行?
例子
看起来像这样的数据框 !http://i.imgur.com/ObUzY7p.png 零时间设置正确(图像未显示)
如果要将列中的每个值除以 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 部分。 Apply 可能是 运行 快速处理多个行和列的函数的最佳选择。至于为什么在除以浮点数时得到 nans,列中的值是否可能不是浮点数或整数?
这应该有效:
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()