我有一个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}
谢谢!
最佳答案
对我来说,可以创建新的 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}
关于Python pandas 数据框和系列之间的列分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215699/