数据帧和系列之间的Python pandas列对齐不起作用

时间:2016-10-24 10:07:04

标签: 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)设置列cd的值。

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}

谢谢!

1 个答案:

答案 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}