迭代数据框的行,并将多个计算值分配给行
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
我有一个 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