我有两个数据帧。
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
我如何为这两个数据帧应用该函数?
答案 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)
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