Python自定义未熔化-从重复的行创建列
我有以下数据帧:Python自定义未熔化-从重复的行创建列,python,pandas,duplicates,melt,Python,Pandas,Duplicates,Melt,我有以下数据帧: import pandas as pd import numpy as np base_df = pd.DataFrame({ 'id': [1,2,3], 'base_value': [100, None, 123.1] }) id base_value 1 100.0 2 NaN 3 123.1 还有一个: extended_df = pd.DataFrame({ 'id': [1, 1, 2, 2, 3], 'ext_i
import pandas as pd
import numpy as np
base_df = pd.DataFrame({
'id': [1,2,3],
'base_value': [100, None, 123.1]
})
id base_value
1 100.0
2 NaN
3 123.1
还有一个:
extended_df = pd.DataFrame({
'id': [1, 1, 2, 2, 3],
'ext_id': [100, 500, 90, 1, 1000],
'role_1': [True, False, False, True, True],
'role_2': [False, True, True, False, False],
'ext_value': [10, 5, 21, 200, 500]
})
id ext_id role_1 role_2 ext_value
1 100 True False 10
1 500 False True 5
2 90 False True 21
2 1 True False 200
3 1000 True False 10
因此,我希望获得以下数据帧:
result_df = pd.DataFrame({
'id': [1,2,3],
'base_value': [100, None, 123.1],
'ext_value_role_1': [10, 200, 500],
'ext_value_role_2' :[5, 21, None]
})
id base_value ext_value_role_1 ext_value_role_2
1 100.0 10 5.0
2 NaN 200 21.0
3 123.1 500 NaN
这一转变背后的逻辑如下。对于base_-df
中的每一行,在extended_-df
中查找匹配项。生成的数据帧将包含与扩展的
中的角色*
列数乘以外部值
列数一样多的附加列(不包括id
,基本值
)。如果id
的角色设置为False
,则列中的结果值为None
我想出了下面的代码。它适用于小示例,但我希望得到更多的pandas
esque
def multiply_by_boolean(boolean_value, variable):
if boolean_value is False:
return None
elif boolean_value is None:
raise ValueError('boolean_value cannot be None')
return variable
extended_df['ext_value_role_1'] = extended_df.apply(lambda x: multiply_by_boolean(x['role_1'], x['ext_value']), axis=1)
extended_df['ext_value_role_2'] = extended_df.apply(lambda x: multiply_by_boolean(x['role_2'], x['ext_value']), axis=1)
res_df = extended_df[['id', 'ext_value_role_1', 'ext_value_role_2']]
res_df = res_df.groupby('id').agg('max')
res_df = res_df.merge(right=base_df, left_index=True, right_on='id')
您可以使用
merge
构建临时数据框,然后只添加相关列:
tmp=base_df.merge(扩展的_df,on='id')
正如预期的那样:
id base_value ext_value_role_1 ext_value_role_2
0 1 100.0 10 5.0
1 2 NaN 200 21.0
2 3 123.1 500 NaN
id base_value ext_value_role_1 ext_value_role_2
0 1 100.0 10 5.0
1 2 NaN 200 21.0
2 3 123.1 500 NaN