我有一个看起来像这样的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。
当我运行上面的代码时,我没有收到错误,但数据框完全没有变化。谁能告诉我原因,还是可以帮我写一些能做到这一点的代码?
赞赏!
答案 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