Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python自定义未熔化-从重复的行创建列_Python_Pandas_Duplicates_Melt - Fatal编程技术网

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