我正在和Pandas合作,我有一个数据框,我们可以填充三个值中的一个:
ID_1 ID_2 ID_3
abc NaN NaN
NaN def NaN
NaN NaN ghi
NaN NaN jkl
NaN mno NaN
pqr NaN NaN
我的目标是将这三列合并到我的数据框中的新列中:
ID_1 ID_2 ID_3 Combined_ID
abc NaN NaN abc
NaN def NaN def
NaN NaN ghi ghi
NaN NaN jkl jkl
NaN mno NaN mno
pqr NaN NaN pqr
理想情况下,它只会找到第1列到第3列中存在的非空值,但我也可以连接,因为我们应该只为每行填充三个中的一个。感谢。
df_note = pd.read_csv("NoteIds.csv")
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3
答案 0 :(得分:12)
你可以使用求和的属性来连接字符串值,这样你就可以调用fillna
并传递一个空的str和调用sum
并将param axis=1
传递给sum行 - 明智:
In [26]:
df['Combined_ID'] = df.fillna('').sum(axis=1)
df
Out[26]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
如果您只对这3列感兴趣,可以选择它们:
In [39]:
df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1)
df
Out[39]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
答案 1 :(得分:3)
假设每行可以有多个非NaN值。这仍然有用。
In [43]: df['Combined_ID'] = df.apply(
lambda x : ''.join([e for e in x if isinstance(e, basestring)]),
axis=1)
对于每一行,提取字符串项并加入它们。
In [44]: df
Out[44]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
我喜欢@ EdChum的答案,看起来更具可读性。
有趣的是,fillna('').sum(axis=1)
方法对于这些较小的数据来说是昂贵的。
In [45]: %timeit df.fillna('').sum(axis=1)
1000 loops, best of 3: 808 µs per loop
In [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1)
1000 loops, best of 3: 285 µs per loop
仅适用于['ID_1','ID_2','ID_3']
列
df[['ID_1','ID_2','ID_3']].apply(lambda_function)
答案 2 :(得分:0)
另一种方式:
df['Combined_ID'] = df.ID_1.fillna('') + df.ID_2.fillna('') + df.ID_3.fillna('')
输出:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr