Pandas 数据帧值和行条件都取决于其他列
Pandas dataframe values and row condition both depend on other columns
我有一个 Pandas 数据框:
import pandas as pd
df = pd.DataFrame({'col1': ['a','a','b','b'],
'col2': [1,2,3,4],
'col3': [11,12,13,14]})
col1 col2 col3
0 a 1 11
1 a 2 12
2 b 3 13
3 b 4 14
如果 col1
中的值是 b
,但如果 col1
中的值不是 b
,则保留行不变。假设函数是 col3 * exp(col2)
,然后将其应用于上面的 df
将产生
col1 col2 col3
0 a 1 11
1 a 2 12
2 b 261.1 13
3 b 764.4 14
理想情况下,这将是矢量化的和就地的,因为我的真实 DataFrame 有几百万行。
这与 Stack Overflow 上的其他问题不同,因为它们只要求新值不依赖于其他列或一次更改所有行。谢谢。
编辑:更正了目标 DataFrame。已将函数从 exp(col2)+col3
更改为 exp(col2)*col3
而未更新示例中的值。
使用DataFrame.iloc
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1': ['a', 'a', 'b', 'b'], 'col2': [1, 2, 3, 4], 'col3': [11, 12, 13, 14]})
df.loc[df['col1'] == 'b', 'col2'] = df['col3'] * np.exp(df['col2'])
print(df)
给出正确的答案
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14
np.where
完成任务:
df.col2 = np.where(df.col1 == "b", df.col3 * np.exp(df.col2), df.col2)
它说“对于每一行:如果 df
在 col1
中有 'b'
,则从第二个参数(这是 col2
的函数和col3
); 如果不是,则从第三个参数中获取值(即 col2
所以它保持原样)。”。以矢量化方式将其应用于每一行。
获得
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1': ['a','a','b','b'],
'col2': [1,2,3,4],
'col3': [11,12,13,14]})
def get_exp(col1, col2, col3):
if col1 == 'b':
return (col3 * np.exp(col2))
return col2
df.col2 = df.apply(lambda x: get_exp(x.col1, x.col2, x.col3), axis=1)
print(df)
输出:
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14
我有一个 Pandas 数据框:
import pandas as pd
df = pd.DataFrame({'col1': ['a','a','b','b'],
'col2': [1,2,3,4],
'col3': [11,12,13,14]})
col1 col2 col3
0 a 1 11
1 a 2 12
2 b 3 13
3 b 4 14
如果 col1
中的值是 b
,但如果 col1
中的值不是 b
,则保留行不变。假设函数是 col3 * exp(col2)
,然后将其应用于上面的 df
将产生
col1 col2 col3
0 a 1 11
1 a 2 12
2 b 261.1 13
3 b 764.4 14
理想情况下,这将是矢量化的和就地的,因为我的真实 DataFrame 有几百万行。
这与 Stack Overflow 上的其他问题不同,因为它们只要求新值不依赖于其他列或一次更改所有行。谢谢。
编辑:更正了目标 DataFrame。已将函数从 exp(col2)+col3
更改为 exp(col2)*col3
而未更新示例中的值。
使用DataFrame.iloc
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1': ['a', 'a', 'b', 'b'], 'col2': [1, 2, 3, 4], 'col3': [11, 12, 13, 14]})
df.loc[df['col1'] == 'b', 'col2'] = df['col3'] * np.exp(df['col2'])
print(df)
给出正确的答案
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14
np.where
完成任务:
df.col2 = np.where(df.col1 == "b", df.col3 * np.exp(df.col2), df.col2)
它说“对于每一行:如果 df
在 col1
中有 'b'
,则从第二个参数(这是 col2
的函数和col3
); 如果不是,则从第三个参数中获取值(即 col2
所以它保持原样)。”。以矢量化方式将其应用于每一行。
获得
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1': ['a','a','b','b'],
'col2': [1,2,3,4],
'col3': [11,12,13,14]})
def get_exp(col1, col2, col3):
if col1 == 'b':
return (col3 * np.exp(col2))
return col2
df.col2 = df.apply(lambda x: get_exp(x.col1, x.col2, x.col3), axis=1)
print(df)
输出:
col1 col2 col3
0 a 1.00000 11
1 a 2.00000 12
2 b 261.11198 13
3 b 764.37410 14