Pandas 将所有列的值连接到一个新的列列表中
Pandas concatenate values of all column into a new column list
我正在尝试将我所有的列合并到一个新列中。串联的值应存储在列表中。
我的数据框:
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
以下代码应该有效:
df['concat_col']=df.apply(lambda row: row.dropna().tolist(), axis=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
我正在尝试将我所有的列合并到一个新列中。串联的值应存储在列表中。
我的数据框:
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
以下代码应该有效:
df['concat_col']=df.apply(lambda row: row.dropna().tolist(), axis=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