我有一个像这样的Dataframe:
A B C D
2 1 O s h
4 2 P
7 3 Q
9 4 R h m
我有一个函数f来计算基于行的C和D的行:
def f(p): #p is the value of column B for a row.
return p+'k', p+'n'
如何通过将函数f应用于Dataframe来填充第4行和第7行的缺失值?
预期结果如下:
A B C D
2 1 O s h
4 2 P Pk Pn
7 3 Q Qk Qn
9 4 R h m
函数f必须使用,因为实际函数非常复杂。此外,该功能只需要应用于缺少C和D的行
答案 0 :(得分:2)
也许有更优雅的方式,但我会这样做:
df['C'] = df['B'].apply(lambda x: f(x)[0])
df['D'] = df['B'].apply(lambda x: f(x)[1])
将函数应用于列并获取输出的第一个和第二个值。它返回:
A B C D
0 1 O Ok On
1 2 P Pk Pn
2 3 Q Qk Qn
3 4 R Rk Rn
编辑:
以更简洁的方式,感谢this answer:
df[['C','D']] = df['B'].apply(lambda x: pd.Series([f(x)[0],f(x)[1]]))
答案 1 :(得分:2)
如果你想使用这样的功能,这是一个单行:
df.update(df.B.apply(lambda x: pd.Series(dict(zip(['C','D'],f(x))))), overwrite=False)
In [350]: df
Out[350]:
A B C D
2 1 O s h
4 2 P Pk Pn
7 3 Q Qk Qn
9 4 R h m
你也可以这样做:
df1 = df.copy()
df[['C','D']] = df.apply(lambda x: pd.Series([x['B'] + 'k', x['B'] + 'n']), axis=1)
df1.update(df, overwrite=False)
答案 2 :(得分:1)
def f(row): #row is the value of row.
if row['C']=='':
row['C']=row['B']+'k'
if row['D']=='':
row['D']=row['B']+'n'
return row
df=df.apply(f,axis=1)
答案 3 :(得分:0)
只需执行以下操作即可
df.C.loc[df.C.isnull()] = df.B.loc[df.C.isnull()] + 'k'
df.D.loc[df.D.isnull()] = df.B.loc[df.D.isnull()] + 'n'
如果您想知道为什么我使用loc
答案 4 :(得分:0)
我发现这非常令人困惑,但最终找到了一种不会伤害我的大脑的方法。在这里,抱歉,如果它与示例不匹配...
没有索引的数据框
# function to do the calcs
def f(row):
my_a = row['a'] # row is a Series, my_a is a scalar string
if my_a == 'a': # dummy logic to calc new values based on the row values
return [1, 2] # return 2 values to update 2 columns
else:
return [4, 5]
# simple test frame
input = pd.DataFrame.from_dict({
'a': ['a', 'd'],
'b': ['b', 'e'],
'c': ['c', 'f'],
'x': [0, 0],
'y': [0, 0]
})
# apply the function to update the x and y columns with the returned values
input[['x','y']] = input.apply(f, axis=1)
带索引的数据框
如果您的数据框有索引..您在执行应用程序时需要更加明确,以确保“类似列表的结果将转换为列”...
def f(row): # function to do the calcs
my_a = row['a'] # row is a Series, my_a is a scalar string
my_index = row.name # you might also want to use the index value in the calcs
if my_a == 'a': # dummy logic to calc new values based on the row values
return [1, 2] # return 2 values to update 2 columns
else:
return [4, 5]
input = pd.DataFrame.from_dict({
'an_index': ['indx1', 'indx2'],
'a': ['a', 'd'],
'b': ['b', 'e'],
'c': ['c', 'f'],
'x': [0, 0],
'y': [0, 0]
}).set_index(['an_index'])
# apply the function to update the x and y columns with the returned values
input[['x','y']] = input.apply(f, axis=1, result_type='expand')