我有一个n列的数据框
col1 col2 col3
----------------------
val
val
NaN
val
val
val1
val1
NaN
val1
val1
val2
val2
NaN
val2
val2
我想将n列转换为单列,如下:
col4
-----
val
val
NaN
val
val
val1
val1
NaN
val1
val1
val2
val2
NaN
val2
val2
我正在获取每一列数据,而当我分配数据时,它将覆盖数据。
for i in range(len(df)):
col = df[i]
df1['A']=df[col]
但是它会覆盖以前写入的数据。因此,如果我不希望数据被覆盖并使用pandas将n列数据添加到单列中
答案 0 :(得分:2)
正如您在评论中说的,空白是NaN,因此您只需要T
和bfill
df2.T.bfill().iloc[0]
Out[141]:
0 val
1 val
2 NaN
3 val
4 val
5 val1
6 val1
7 NaN
8 val1
9 val1
10 val2
11 val2
12 NaN
13 val2
14 val2
Name: col1, dtype: object
注意:最初,我为填补df
而填写,以防万一,所以我同时使用了ffill
和bfill
。如果不需要,可以将ffill
或bfill
与其他iloc
df2.T.ffill().iloc[-1]
答案 1 :(得分:1)
您可以在行上使用简单的总和:
import pandas as pd
import numpy as np
df=pd.DataFrame({'col1': [1, np.NaN,np.NaN,np.NaN,], 'col2':
[np.NaN,2,np.NaN,np.NaN,], 'col3': [np.NaN,np.NaN,3,np.NaN,]})
df
col1 col2 col3
0 1.0 NaN NaN
1 NaN 2.0 NaN
2 NaN NaN 3.0
3 NaN NaN NaN
现在您可以对行求和(通过使用axis = 1),我们希望NaN的总和为NaN,所以我们使用min_count = 1:
%%timeit
df['col4'] = df.sum(axis=1,min_count=1)
Out: 1000 loops, best of 3: 334 µs per loop
%%timeit
df.T.bfill().iloc[0]
Out: 1000 loops, best of 3: 524 µs per loop
答案 2 :(得分:0)
这可能是效率最低的方法,但是应该可以完成工作:
combined_col = []
for i in range(len(df)):
col = df.iloc[i, :]
if col.isnull().sum() == len(df.columns):
combined_col.append(np.NAN)
else:
combined_col.append(col[~col.isnull()][0])
df['combined_col'] = combined_col
结果:
col1 col2 col3 combined_col
0 1.0 NaN NaN 1.0
1 2.0 NaN NaN 2.0
2 NaN NaN NaN NaN
3 3.0 NaN NaN 3.0
4 4.0 NaN NaN 4.0
5 NaN 7.0 NaN 7.0
6 NaN 13.0 NaN 13.0
7 NaN NaN NaN NaN
8 NaN 22.0 NaN 22.0
9 NaN 16.0 NaN 16.0
10 NaN NaN 12.0 12.0
11 NaN NaN 32.0 32.0
12 NaN NaN NaN NaN
13 NaN NaN 1.0 1.0
14 NaN NaN 6.0 6.0
答案 3 :(得分:0)
首先,使用DataFrame.replace
将空字符串转换为NaN's
,然后将DataFrame.ffill
用作:
df = df.replace({' ':np.nan}).ffill(1)['col3'].to_frame(name='col4')
print(df)
col4
0 val
1 val
2 NaN
3 val
4 val
5 val1
6 val1
7 NaN
8 val1
9 val1
10 val2
11 val2
12 NaN
13 val2
14 val2