我正在尝试将我的所有专栏合并到一个新专栏中。串联的值应存储在列表中。
我的数据框:
df = pd.DataFrame({'A': ['1', '2', nan],
'B': [nan, '5', nan],
'C': ['7', nan, '9']})
所需的输出:
df:
A B C concat_col
1 nan 7 [1,7]
2 5 nan [2,5]
nan nan 9 [9]
我尝试过的事情:
df['concat'] = pd.Series(df.fillna('').values.tolist()).str.join(',')
我得到的输出:
A B C concat_col
1 nan 7 1,,7
2 5 nan 2,5,,
nan nan 9 ,,9
答案 0 :(得分:1)
以下代码应该起作用:
df['concat_col']=df.apply(lambda row: row.dropna().tolist(), axis=1)
答案 1 :(得分:1)
您可以利用列表推导,利用事实np.nan != np.nan
:
df['D'] = [[i for i in row if i == i] for row in df.values]
print(df)
A B C D
0 1 NaN 7 [1, 7]
1 2 5 NaN [2, 5]
2 NaN NaN 9 [9]
从直觉上讲,这比Pandas方法更有效:
df = pd.concat([df]*10000, ignore_index=True)
%timeit df.apply(lambda row: row.dropna().tolist(), axis=1) # 8.25 s
%timeit [[i for i in row if i == i] for row in df.values] # 55.6 ms