EMC*_*EMC 12 python dataframe pandas
我正在和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
Run Code Online (Sandbox Code Playgroud)
我的目标是将这三列组合成我数据框中的新列:
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
Run Code Online (Sandbox Code Playgroud)
理想情况下,它只会找到第1列到第3列中存在的任何非空值,但我也可以连接,因为我们应该只为每行填充三个中的一个.谢谢.
df_note = pd.read_csv("NoteIds.csv")
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3
Run Code Online (Sandbox Code Playgroud)
EdC*_*ica 13
你可以使用求和的属性来连接字符串值,这样你就可以调用fillna
并传递一个空的str和调用sum
,并将param传递axis=1
给row-wise:
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
Run Code Online (Sandbox Code Playgroud)
如果您只对这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
Run Code Online (Sandbox Code Playgroud)
假设每行可以有多个非 NaN 值。这仍然应该有效。
\n\nIn [43]: df['Combined_ID'] = df.apply(\n lambda x : ''.join([e for e in x if isinstance(e, basestring)]),\n axis=1)\n
Run Code Online (Sandbox Code Playgroud)\n\n对于每一行,提取字符串项并将它们连接起来。
\n\nIn [44]: df\nOut[44]:\n ID_1 ID_2 ID_3 Combined_ID\n0 abc NaN NaN abc\n1 NaN def NaN def\n2 NaN NaN ghi ghi\n3 NaN NaN jkl jkl\n4 NaN mno NaN mno\n5 pqr NaN NaN pqr\n
Run Code Online (Sandbox Code Playgroud)\n\n我喜欢@EdChum 的答案,看起来更具可读性。
\n\n有趣的是,fillna('').sum(axis=1)
对于这种较小的数据,方法的成本很高。
In [45]: %timeit df.fillna('').sum(axis=1)\n1000 loops, best of 3: 808 \xc2\xb5s per loop\n\nIn [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1)\n1000 loops, best of 3: 285 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n仅适用于['ID_1','ID_2','ID_3']
列
df[['ID_1','ID_2','ID_3']].apply(lambda_function)\n
Run Code Online (Sandbox Code Playgroud)\n