连接数据框中除 NaN 之外的所有列

Concatenate all columns in dataframe except for NaN

又一个简单的。我有一个 DataFrame (1056 x 39),其中包含来自数据透视表 table 的参考变量。我现在需要生成一列所有列的串联值,其中不包括 NaN。问题是我有很多干扰输出的 NaN。

基于我发现的另一个 post Concatenating all columns in pandas dataframe,我可以使用这种方法。

df['Merge'] = df.astype(str).agg(' or '.join,axis=1)

问题是 NaN 仍然存在。我如何修改此行以排除 NaN 值(基本上跳过它们),以便输出仅包含连接值。

预期输出应显示为(第一行):

df['Merge'][0] = 'Var1 or Var2 or Var 20 or Var28'(排除所有 NaN 值)

谢谢:)

您可以 stack 删除 NaN 然后转换为字符串和 groupby + str.join

import pandas as pd
df = pd.DataFrame([[1.0, np.NaN, 2, 3, 'foo'], [np.NaN, None, 5, 'bar', 'bazz']])

df['merged'] = df.stack().astype(str).groupby(level=0).agg(' or '.join)
#     0   1  2    3     4                merged
#0  1.0 NaN  2    3   foo  1.0 or 2 or 3 or foo
#1  NaN NaN  5  bar  bazz      5 or bar or bazz

或者您可以沿行应用,删除空值,转换为字符串,然后加入所有非空值。

df = pd.DataFrame([[1.0, np.NaN, 2, 3, 'foo'], [np.NaN, None, 5, 'bar', 'bazz']])

df['merged'] = df.apply(lambda row: ' or '.join(row.dropna().astype(str)), axis=1)
#     0   1  2    3     4                merged
#0  1.0 NaN  2    3   foo  1.0 or 2 or 3 or foo
#1  NaN NaN  5  bar  bazz      5 or bar or bazz