Python pandas 数据框和系列之间的列分配不起作用
Python pandas column asignment between dataframe and series does not work
我有一个 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
我想用我的函数 func(x)
做一个 df.apply()
来设置列 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
的返回系列中获取结果?我怎样才能实现正确的列分配?当然我的函数andapply()
要复杂得多,这就是我在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}
我有一个 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
我想用我的函数 func(x)
做一个 df.apply()
来设置列 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
的返回系列中获取结果?我怎样才能实现正确的列分配?当然我的函数andapply()
要复杂得多,这就是我在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}