我有一个df
数据框:
df = pd.DataFrame({'b':[100,100,100], 'a':[1,2,3]})
df['c'] = pd.np.nan
df['d'] = pd.np.nan
df['c'] = df['c'].astype(object)
df['d'] = df['d'].astype(object)
df
是:
a b c d
0 1 100 NaN NaN
1 2 100 NaN NaN
2 3 100 NaN NaN
我想使用我的函数df.apply()
进行func(x)
设置列c
和d
的值。
func(x)
是:
def func(x):
return pd.Series({'d':{'foo':5, 'bar':10}, 'c':300})
df.apply()
是:
df[['d', 'c']] = df.apply(lambda x: func(x), axis=1)
结果是:
a b c d
0 1 100 {'foo': 5, 'bar': 10} 300
1 2 100 {'foo': 5, 'bar': 10} 300
2 3 100 {'foo': 5, 'bar': 10} 300
我的问题是,为什么列c
从索引为d
的返回系列中获取结果?我怎样才能实现正确的列分配?当然我的函数和apply()
要复杂得多,这就是我在return
使用字典的原因。所以df[['c', 'd']] = df.apply(lambda x: func(x), axis=1)
不是我真正问题的解决方案。
期望的结果是:
a b c d
0 1 100 300 {'foo': 5, 'bar': 10}
1 2 100 300 {'foo': 5, 'bar': 10}
2 3 100 300 {'foo': 5, 'bar': 10}
谢谢!
答案 0 :(得分:2)
对我来说,可以创建新的DataFrame
df1
,然后concat
创建原始df
:
def func(x):
return pd.Series({'d':{'foo':5, 'bar':10}, 'c':300})
df1 = df.apply(lambda x: func(x), axis=1)
print (df1)
c d
0 300 {'bar': 10, 'foo': 5}
1 300 {'bar': 10, 'foo': 5}
2 300 {'bar': 10, 'foo': 5}
print (pd.concat([df[['a','b']], df1], axis=1))
a b c d
0 1 100 300 {'bar': 10, 'foo': 5}
1 2 100 300 {'bar': 10, 'foo': 5}
2 3 100 300 {'bar': 10, 'foo': 5}