在pandas中为两个数据帧应用函数

时间:2017-06-09 10:40:07

标签: python pandas

我有两个数据帧。

DF0

    a    b 
c  0.3  0.6
d  0.4  NaN    

DF1

   a  b
c  3  2
d  0  4

我有自定义功能:

def concat(d0,d1):
    if d0 is not None and d1 is not None:
        return '%s,%s' % (d0, d1)
    return None

结果我期待:

     a      b
  c  0.3,3  0.6,2
  d  0.4,0  NaN

我如何为这两个数据帧应用该函数?

3 个答案:

答案 0 :(得分:0)

这是一个解决方案。 这个想法首先是将您的数据帧减少到一个平坦的值列表。这允许您使用zip循环遍历两个数据帧的值并应用您的函数。 最后,使用numpy reshape

返回原始形状
new_vals = [concat(d0,d1) for d0, d1 in zip(df1.values.flat, df2.values.flat)]
result = pd.DataFrame(np.reshape(new_vals, (2, 2)), index = ['c', 'd'], columns = ['a', 'b'])

答案 1 :(得分:0)

addapplymapmask一起使用:

df = df0.astype(str).add(',').add(df1.astype(str))
df = df.mask(df.applymap(lambda x: 'nan' in x))
print (df)
       a      b
c  0.3,3  0.6,2
d  0.4,0    NaN

另一个解决方案是使用mask的条件最后替换NaN,默认情况下True被替换为NaN

df = df0.astype(str).add(',').add(df1.astype(str))
m = df0.isnull() | df1.isnull() 
print (m)
       a      b
c  False  False
d  False   True

df = df.mask(m)
print (df)
       a      b
c  0.3,3  0.6,2
d  0.4,0    NaN

答案 2 :(得分:0)

如果您是特定的应用程序,则可以执行以下操作:

#Concatenate the two as String
df = df0.astype(str) + "," +df1.astype(str)
#Remove the nan
df = df.applymap(lambda x: x if 'nan' not in x else np.nan)

你比使用apply

更能表现出色

输出

    a        b
c   0.3,3   0.6,2
d   0.4,0    NaN