Python pandas 数据框和系列之间的列分配不起作用

标签 python pandas dataframe variable-assignment series

我有一个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/

相关文章:

python - 在numpy中用零填充数组

python - 将str转换为numpy.ndarray

python - 根据 Pandas 列中的多个值从 DataFrame 中选择行

python - 在 Pandas 循环中合并多个系列

python - 查找列中的部分文本,如果找到 true 则传递通过反射(reflect)分配的文本值而不是 true 或 false 创建新列

python - Django 在没有上下文的情况下进行渲染。为什么?

python - 使用 pandas 将字符串对象转换为 int/float

python - Pandas 条件创建多列

r - 双循环填充数据框 - 如何修复 "invalid function in complex assignment"

python - 使用 isinstance() 与鸭子类型(duck typing)