如何使用自定义函数更改pandas数据框中特定行的多列?



我想用定义的自定义函数编辑以下数据框,我的数据框对于通过自定义函数的行返回空

df
field      value1            value2          value3
0    target     ['list']       ['123','length']     'abc'
1    random      [32.67]           [47.00]          'bcd'
2    target      ['word']           [105]           'efg'
3    target2   ["key":"123"]    ["key":"333"]       'xyz'

my custom function

def f(field, value1, value2):
if field == 'target':
value1 = [{item} for item in value1]
value2 = [{item} for item in value2]
elif field == 'target2':
value1 = [{item.values()} for item in value1]
value2 = [{item.values()} for item in value2]
return pd.Series([value1, value2])

所以我做了下面的

mask = df['field'].isin(['target','target2'])
df.loc[mask,['value1','value2']] = df[mask].apply(lamba row: f(row['field'], row['value1'], row['value2'], axis=1)

我的结果如下,这导致我的目标行返回为NaN

df
field      value1       value2     value3
0    target       NaN          NaN        'abc'
1    random      [32.67]      [47.00]     'bcd'
2    target       NaN          NaN        'efg' 
3    target2      NaN          NaN        'xyz' 

my Expected result

df
field      value1               value2              value3
0    target     [{'list'}]       [{'123'},{'length'}]     'abc'
1    random      [32.67]             [47.00]              'bcd'
2    target      [{'word'}]          [{105}]              'efg'
3    target2    [{"123"}]            [{"333"}]            'xyz'

谢谢!

您需要将返回的Series的index设置为与列匹配

def f(field, value1, value2):
if field == 'target':
value1 = [{item} for item in value1]
value2 = [{item} for item in value2]
elif field == 'target2':
value1 = [{item.values()} for item in value1]
value2 = [{item.values()} for item in value2]
s = pd.Series([value1, value2], index=['value1', 'value2']) # <--- changes here
return s
mask = df['field'].isin(['target','target2'])
df.loc[mask, ['value1','value2']] = df[mask].apply(lambda row: f(row['field'], row['value1'], row['value2']), axis=1)
print(df)
field     value1             value2 value3
0   target   [{list}]  [{123}, {length}]  'abc'
1   random    [32.67]             [47.0]  'bcd'
2   target   [{word}]            [{105}]  'efg'
3  target2  [{(123)}]          [{(333)}]  'xyz'

最新更新