熊猫数据框中的NaN值不变

时间:2018-10-15 12:02:01

标签: python pandas loops dataframe nan

我有一个看起来像这样的pandas数据框。

import pandas as pd
import math

inp = [{'c1':-5, 'c2':-2, 'c3':-3,'c4:360}, {'c1'1:, 'c2':-3, 'c3':4,'c4:550}, {'c1':NaN, 'c2':NaN, 'c3':NaN,'c4:NaN}]
df = pd.DataFrame(inp)

输出:

   c1  c2  c3  c4
0  -5  -2  -3  360
1   1  -3  4   550
2  NaN NaN NaN NaN

我想遍历行并更改在c4中获得NaN值的那些行。然后更改所有已获得此值的单元格中的值。

for index, row in df.iterrows():
    if math.isnan(row["c4"]) == True:
    row["c1"] = float(0)
    row["c2"] = float(df["c1"][0]) + float(df["c2"][0])
    row["c3"] = row["c2"] - row["c1"]
    row["c4"] = float(2880)

对于第一列,它应该只是0。

对于第二列,应该将c1和c2中的第一行值相加。

第三列应该是第一列减去第二列。

最后一列应该是2880。

当我运行上面的代码时,我没有收到错误,但数据框完全没有变化。谁能告诉我原因,还是可以帮我写一些能做到这一点的代码?

赞赏!

1 个答案:

答案 0 :(得分:2)

您可以通过使用常规索引避免循环:

idx = df.c4.isnull()
df.loc[idx,'c1'] = 0
df.loc[idx,'c2'] = df.iloc[0,0] + df.iloc[0,1]
df.loc[idx,'c3'] = df.loc[idx,'c2'] - df.loc[idx,'c1']
df.loc[idx,'c4'] = 2880.

输出:

 c1   c2   c3      c4
0 -5.0 -2.0 -3.0   360.0
1  1.0  3.0  4.0   550.0
2  0.0 -7.0 -7.0  2880.0