迭代数据框的行,并将多个计算值分配给行

Iterating over rows of a dataframe, and assigning multiple calculated values to the rows

我有一个 df:

dict1 = {'A': 1, 'B': 2, 'C': 3, 'D': 4}
dict2 = {'A': 10, 'B': 20, 'C': 30, 'D': 40}
dict3 = {'A': 100, 'B': 200, 'C': 300, 'D': 400}
df = pd.DataFrame([dict1, dict2, dict3])

(我在家工作,我不能在这里复制粘贴输出,抱歉)

现在,我想 'enlarge' df,然后将计算值分配给新列。

df[['new_col1', 'new_col2']] = None
for idx, row in df.iterrows():
    # insert the calculated values for `new_col1` and `new_col2` here

我想我确实需要遍历行,因为计算是基于行的值。我当然可以使用 .at 为每个单元格手动插入值,但我有数十万行,并且 ~20 需要填写计算值。我该怎么做?

我试过了:

dictt = {'new_col1': 1, 'new_col2': 2}
df.iloc[0] = df.iloc[0].map(dictt)

但是如果我检查 df.iloc[0] 是什么,它是一行 NaN。我也试过:

df.iloc[0] = df.iloc[0].replace(dictt)

但这并没有起到任何作用。另外,如果有更好/更合适的方法来进行这样的操作,我洗耳恭听。

如果你有一些复杂的函数,主要瓶颈在这个函数中,而不是在 pandas 中,这里是如何在 DataFrame.apply 中迭代的解决方案:

def f(a, b):
    return pd.Series({'new_col1': 1 + a, 'new_col2': 2 + b})

df = df.join(df.apply(lambda x: f(x.A, x.B), axis=1))
print (df)
     A    B    C    D  new_col1  new_col2
0    1    2    3    4         2         4
1   10   20   30   40        11        22
2  100  200  300  400       101       202

另一个想法:

def f(a, b):
    return (1 + a,  2 + b)

df[['col1','col2']] = df.apply(lambda x: f(x.A, x.B), axis=1, result_type='expand')
print (df)
     A    B    C    D  col1  col2
0    1    2    3    4     2     4
1   10   20   30   40    11    22
2  100  200  300  400   101   202